본문 바로가기
깨알 c언어

깨알 c언어 ch.31 ~ 35

by moca7 2024. 3. 8.

31. 포인터 배열(1)

32. 포인터 배열(2)

33. 포인터 배열(3)

34. 포인터 배열(4)

35. 구조체

 

 

 

31. 포인터 배열(1)

 

ㅁ 포인터 배열

- 포인터 변수인데 배열화 시킨 것. 

- 배열 형태인데 그 배열의 각각의 요소에 주소값이 들어가는 것.

 

- 배열의 요소가 포인터(메모리주소)로 이루어진 것.

 

  char a[3];      <-      이렇게 선언하면 a b c 이렇게 들어감

  char *a[3];     <-      이렇게 포인터변수를 배열로 만들면 a b c가 아니라 주소값이 들어감

 

ㅁ 일반적인 배열

 

- a에는 100번지가 들어감.

- %s는 문자열(두 개 이상의 문자 결합구조) 출력. %c는 단일문자 출력.

- c언어의 문자 자료형은 메모리 한 칸에 하나의 문자만 삽입될 수 있음.

- %c는 char형을 요구, %s는 char *형을 요구함. 

%s는 주소값을 받아 문자열을 끝까지 출력함.

 

- a라는 주소값(100번지)을 받아서 맨 끝의 null문자를 만날때까지 abc를 출력함. 

 

ㅁ 포인터 변수에 문자열 넣기

 

- str에 100번지가 들어감. 

- 포인터라는 것은 메모리의 주소값을 받는거니까. 

 

ㅁ 포인터 배열

 

- student라는 포인터 변수를 만드는데 3개의 공간을 가진 배열로 만든다. 

- 저 각각의 배열 요소에는 주소값이 들어가게 된다. 

- 20, 30, 40이라는 주소값이 들어감. 

 

ㅁ 문제

 

- c+1은 101번지. 

- %s는 주소값을 받아 문자열을 끝까지 출력함.

- 101번지의 실제값에는 30이라는 주소값이 들어가 있음. 

- 첫번째 a는 20번지, 그 다음 a는 21번지, 그 다음 a는 22번지임. aaa가 가지는 첫번째 주소값 20번지를 0번요소에 저장하게 되고.

 

ㅁ 포인터 배열, 배열 포인터

- 데이터타입 (*포인터이름) [배열크기];           

      int             (*ptr)             [3]             <- 이게 배열 포인터

 

-    int            *ptr       [3]                  <- 괄호 안들어가면 포인터 배열이다. 괄호들어가면 배열포인터고. 

 

 

32. 포인터 배열(2)

 

ㅁ 문제

 

- array1에는 20(100번지)과 50(101번지)이라는 주소값이 들어감

- %s. 문자열을 출력하기 위해 주소값을 받는다. 

array1의 0번지. 20이다.        왜? 배열 a[0]은 그 배열의 첫번째 값이니까. 주소값이 아니라.

+5하면 25번지가 됨.  m이 아니라 25번지부터 다 출력한다.   morning 출력.

 

- 50+6이라는 주소값의 실제 값은 u. u출력. %c는 글자 하나 출력.

 

- 출력.

morning

u

 

 

33. 포인터 배열(3)

 

ㅁ 문제 

 

- 이차원배열로 선언했는데 a[0], a[1].        <- 2차원 배열에선 행으로 쓰나?

행을 대표하는 a의 0번지 같은 경우에는 100번지부터 시작했다하면 100번지가 들어간다.

a의 1번지 행의 대표주소값은 103번지가 된다. 

 

- 포인터배열이라서 a[0]을 넣어도 주소값인 100으로 넣는건지 2차원배열에선 그냥 a[0]=100인건지 모르겠.

- 그리고 b는 임의로 200번지, 201번지.

 

- 답. 103이 아니고 1

- 답. 104가 아니고 -10

- 답.  14

 

- 출력결과. 1 -10 14

 

 

34. 포인터 배열(4)

 

ㅁ 문제

 

24+12+1 = 37

 

- 포인터 배열에는 주소값만 들어갈 수 있다. 

- 20, 30, 40이 들어간다. 

- printf다음 %d를 보면 정수 하나 출력한다. 

- **arr. 100번지의 값은 20번지. 20번지의 값 12.

- 답은 37

 

 

35. 구조체

 

ㅁ 구조체

- 구조를 만드는 언어

- 사람을 표현한다 치면 name, age, height 등의 변수들을 각각 선언하고, 묶어서 사람이라는 하나의 변수를 만듦. 사용자 정의 변수. 

 

- 여러 변수들을 모아서, 하나의 객체를 구성할 때 사용하는 사용자 정의 타입 객체

 

ㅁ 구조체 구성

struct 구조체명

{

    멤버변수 1;                <- 구조체를 구성하는 변수들이 들어감.

    멤버변수 2;

};

 

ㅁ 구조체 정의 및 사용

 

[정의]

struct person

{

    char *name;            <- name이라는 포인터 변수 캐릭터가 있다. 여기엔 문자열을 담을 수 있다. 

    int age;

};

 

[사용]

struct person user1;           <- 구조체 변수를 하나 만들건데 person이라는 구조체인데 이름은 user1.

                                                이러면 user1이라는 변수가 하나 생겼는데 이 안에 name과 age라는 변수가 있다.

user1.name = "h user";        <- user1이 가리키고 있는 name이란 공간 안에 h user를 집어넣는다.

printf("%s", user1.name);      <- %s니까 문자열 출력. 

 

ㅁ 구조체 정의 및 사용2 (생성을 같이함)

struct person

{

   char *name;

   int age;

} test;                                      <- test라는 인스턴스가 바로 생성됨.

 

test.name = "h user";

test.age = 40;

printf("%s:%d", test.name, test.age);

 

ㅁ 구조체 정의 및 사용3 (포인터에 담는 경우)

struct person

{

   char *name;

   int age;

};

 

struct person *p;                         <- person이라는 구조체를 만들고, 포인터 변수로 만듦.

p -> name = "test_2";                  <- 포인터 변수로 만들었을 때는 .이 아닌 화살표를 쓴다. ->

p -> age = 40;

printf("%s:%d", p->name, p->age);

 

ㅁ 문제

 

 

- list라는 구조체를 만드는데 여기엔 포인터변수 fp가 있다. 여기엔 주소값이 담긴다. 정수형 공간을 가리키는 주소값.

- p = &data;        

data가 100번지를 가리키고 있다고 가정하고 p는 110번지를 가리키고 있다고 가정.

근데 이제 p는 110번지의 구조체를 가리키는게 아니고 100번지의 구조체를 가리키게 됨.

data와 포인터변수 p 모두 같은 구조체를 가리키게 됨.

- p->fp = x+1; 

fp는 201번지가 됨. (data는 100번지를 그대로 가리키고 있고, fp는 201번지를 가리킴)

 

- *(++p->fp)

p->fp가 하나다. p를 ++시키는게 아님. 

fp는 202번지가 됨.

 

- 답은 300

 

- 구조체를 이용하는 방법이 두가지,
일반변수처럼, 포인터 변수처럼 이렇게 이용할 수 있는데,
data 이런식으로 일반 변수처럼 이용하게 되면, data.fp 이렇게 사용이 가능하고,
*p 처럼 이용하게 되면, p->fp 이렇게 사용하는 차이점만 있어요..
그리고 fp 는 구조체 안에 들어가 있어서 p 가 fp 를 사용할 수가 있게 되요..
구조체가 여러 변수들을 같이 참조할 수 있는 성질이 있는거지요~~

'깨알 c언어' 카테고리의 다른 글

깨알 c언어 ch.41 ~ 45  (0) 2024.03.10
깨알 c언어 ch.36 ~ 40  (0) 2024.03.09
깨알 c언어 ch.26 ~ 30  (0) 2024.03.08
깨알 c언어 ch.21 ~ 25  (0) 2024.02.22
깨알 c언어 ch.16 ~ 20  (0) 2024.02.22