본문 바로가기
깨알 c언어

깨알 c언어 ch.26 ~ 30

by moca7 2024. 3. 8.

26. 배열과 포인터(2)

27. 배열과 포인터(3)

28. 배열과 포인터(4)

29. 2차원 배열과 포인터(1)

30. 2차원 배열과 포인터(2)

 

 

 

26. 배열과 포인터(2) 

 

ㅁ 배열과 포인터의 관계 (포인터도 배열처럼 사용할 수 있다!)

- int a[5];

  int *b=a;

  a[2] = 10;      b[2] = 20;

 

     a[0]    a[1]    a[2]                            a[3]   a[4]

                          10이 대입됐다가

                          20이 대입됨. (같은 주소값을 가지고 있으므로)                   

 

   a는 100번지임. 그래서 

   b           <- 100번지가 들어감

 

ㅁ 문제

 

a[0]   a[1]   a[2]   a[3]   

  1       2       4       8      

            3이 됨 (a랑 p는 똑같은 주소값을 가지고 있기에)

            4            

                    5

 

출력결과. 8, 10

 

변형문제. int *p= a+1;이었다면?

 

p의 100번지가 a의 101번지가됨. (이렇게 생각하면 안되고 p는 101번지를 가지고 있음)

p[0] = a[1]

 

a[0]   a[1]   a[2]   a[3]   

  1       2       4       8      

                    3

            4

                              5

답은 4+3, 3+5니까 7, 8

 

 

27. 배열과 포인터(3)

 

ㅁ 문제

 

a[0]     a[1]     a[2]     a[3]

 10       20       30

 

p++되면 p의 주소값이 1증가. 그럼 p[0]은 a[1].    p는 101번지가됨. 

               p에는 지금 100이 있음. 근데 p++되면 값이 101이 됨. 

 

*p++ = 100;  <- p++의 실제값이 100이다. 근데 후위연산자이므로, p의 값(p가 가리키고 있는 101번지의 실제값에 100을 넣어라. 그러고나서 p++를 한다. 그럼 p는 102번지가됨.

a[1] = 100이 들어감. 

 

*++p = 200;  <- 103번지에 200이라는 값을 넣어라. 그럼 a[3]=200. 

 

출력결과. a[0]=10, a[1]=100, a[2]=30

 

배열과 포인터변수를 그려라. 

 

 

28. 배열과 포인터(4)

 

ㅁ a[3]이라는 배열이 있을 때, a라는 값이 가지고 있는 것은 첫번째(a[0])의 주소값을 가지고 있다.

 

ㅁ 문제

 

num[0]     num[1]    num[2]    num[3] 

    1              2              3            4

 

pt++;        <- pt는 101번지가 됨.

 

*pt++ = 5;     <- 101번지의 실제값이 5가 됨. num[1]=5, 그리고 pt는 102번지가 됨.

 

*pt++ = 10;    <- 102번지의 실제값이 10이됨. num[2]=10, 그리고 pt는 103번지가 됨.

 

pt --;      <- pt는 102번지가 됨.

 

*pt++ += 20;     <- 102번지의 실제값이 10 + 20이 됨. num[2]=30, 그리고 pt는 103번지가 됨.

 

출력결과. 1, 5, 30, 4

 

 

29. 2차원 배열과 포인터(1)

 

ㅁ 2차원 배열

 

- 각각의 행을 대표하는게 있음. a의 0번지 행을 대표, a의 1번지 행을 대표, a의 2번지 행을 대표.

- 첫 시작 주소, 1이 저장되어 있는 주소를 100이라고 했을 때, 배열은 물리적으로 연속된 공간이므로, 

   100번지 101번지

   102번지 103번지

   104번지 105번지

- 그리고 각각의 대표행이 가지고 있는 것은 그 첫번째 주소값, 100번지 102번지 104번지다.

(각각을 대표하는 행주소가 있음)

- 그리고 이 전체 배열을 대표하는 a라는 것은 a[0]이 가지고 있는 100이라는 주소를 가지게 된다. 

 

- a를 출력. a에 있는 값, 100번지.       100

- *a를 출력. a의 실제값. a는 1을 가리키는게 아니라 a[0]을 가리키고 있다.          100

- **a를 출력. a의 실제값의 실제값.        1

 

ㅁ 문제

 

int data[ ][3]   <- 행값은 없고 열값은 3개다. 이 말은 3개씩 끊겠다는 소리. (= 한 행에 3개씩만 들어간다)

 

1, 3, 4           5, 2, 9           6, 8, 7        <- 이게 아님. 그냥 3행 3열이라는 듯?

 

        data[1]             1  3   4

        data[2]              5  2  9                  <- 0부터 시작.

        data[3]               6  8  7 

 

                              data[0]   100          1  3   4

 data는 100           data[1]   103           5  2  9                    <- data의 0번지는 첫번째인 100번지를 가진다. 

                              data[2]   106           6  8  7 

 

int *p = data[1];           <- 포인터 변수 p의 주소값이, data 1번지다.         p는 103번지.

                                          ( 여기서 data[1]도 배열, 포인터처럼 그냥 쓰면 주소값 )

 

x = *p        <- p가 가리키고 있는건 103번지다. 103번지의 실제 값은 5

 

답. x = 5, y = 9

 

 

30. 2차원 배열과 포인터(2)

 

ㅁ 문제

 

                               darr[0]  100          1  2  3

  darr = 100            darr[1]  103           4  5  6  

                               darr[2]  106           7  8  9

 

*(*darr+1)    <-  *(darr+1)이아니라 *darr+1이므로 *(100+1)은 2 

*(*darr+2)    <-  이건 3

 

*darr[1] = 4

*darr[2] = 7

 

답은 5, 11

 

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

깨알 c언어 ch.36 ~ 40  (0) 2024.03.09
깨알 c언어 ch.31 ~ 35  (0) 2024.03.08
깨알 c언어 ch.21 ~ 25  (0) 2024.02.22
깨알 c언어 ch.16 ~ 20  (0) 2024.02.22
깨알 c언어 ch.11 ~ 15  (0) 2024.02.22