iOS/정보처리기사

[정보처리기사] C언어 - 배열 포인터

Chafle 2022. 6. 20. 22:41
반응형
배열포인터란?

 

배열의 시작 주소값을 저장할 수 있는 포인터 2차원 배열의 구조

 

 

 

 

배열 포인터의 선언

 

- 괄호로 묶어서 선언한다.

- [숫자]는 "어떤 구조가 들어오든지 숫자만큼 자르겠다."로 해석하자

 

 


 

ex

 

int(*in)[2];

int num[3] = {1,2,3};

in = num;

 


int num[3] = {1,2,3};

num 100번지 101번지 102번지
100 1 2 3

이 상태에서 2개씩 자르겠다 1,2/ 3 /   /   /

-> 물리적으로 자르는 것이 아니고 논리적으로 자르기 떄문에, 아래와 같이 행 대표주소는 연속성을 이어서 102번지로 들어간다.

 

 

in = num;

in 배열 행 대표주소 주소값 주소값
100번지 in[0] 100번지 1 2
in[1] 102번지 3  

 

 

printf("%d₩n", in); in은 100번지니까 100 출력된다.

printf("%d₩n", num); num도 100번지니까 100 출력된다.

printf("%d₩n", *in);  *in -> in의 값(=in이 참조하고 있는 값) = 행의 대표주소를 참조하고 있으므로 100번지를 출력하게 된다.

printf("%d₩n", **in);  -> in의 값의 값(=in이 참조하고 있는 값이 다시 참조하고 있는 값) = 100번지의 주소값인 1 출력된다.

printf("%d₩n", *(*in+1)); -> in의 값의 +1한 것의 값(in이 참조하는 값에서 1더한 값이 참조하고 있는 값) = 101번지의 값인 2가 출력된다.

printf("%d₩n", *(*in+2)); -> in의 값의 +2한 것의 값(in이 참조하는 값에서 2더한 값이 참조하고 있는 값) = 102번지의 값인 3가 출력된다.

printf("%d₩n", *in[1]); -> in의[1]배열 의 값(in[1]은 102번지고 102번지가 참조하고 있는 값) = 3이 출력된다.

 

 

100

100

100

1

2

3

3

 

 

반응형

 


 

ex2

 

int(*in)[4];

int num[3][3] = {1,2,3,4,5,6,7,8,9};

in = num;

 


 

int(*in)[4];

in을 네 구역으로 쪼개겠다는 의미

 

 

int num[3][3] = {1,2,3,4,5,6,7,8,9};

3행 3열짜리 배열을 만들어라

num은 배열의 대표행 주소를 받고 대표행 주소는 각 배열의 첫 번째 주소값을 참조한다.

num 배열 대표행 주소 주소값[임의의주소] 주소값[임의의주소] 주소값[임의의주소]
100번지 num[0] 100번지 1[100] 2[101] 3[102]
num[1] 103번지 4[103] 5[104] 6[105]
num[2] 106번지 7[106] 8[107] 9[108]

 

in = num;

in을 논리적으로 [4] 네 구역으로 쪼개면

다음과 같다.

in 배열 대표행 주소 주소값[임의의주소] 주소값[임의의주소] 주소값[임의의주소]  
100번지 in[0] 100번지 1[100] 2[101] 3[102] 4[103]
in[1] 104번지 5[104] 6[105] 7[106] 8[107]
in[2] 108번지 9[108]      

 

 

printf("%d", **in);  -> in이 참조하는 값이 참조하는 값 = 100번지의 값 = 1

printf("%d", *(*in+1)); -> ( in이 참조하는 값 +1 )이 참조하는 값 = 101번지의 값 = 2

printf("%d", **(in+1); -> in이 가르키는 공간의 다음 공간이 참조하는 값이 참조하는 값 = in[1]가 참조하는 값 = 5

 

 

 

 


 

 

ex.3

 

#include<stdio.h>

#include<stdlib.h>

#define N 3

int main(void){

int (*in)[N], *out, sum = 0;

in = (int(*)[N]) malloc( N* N * sizeof(int) );

out = (int *) in;

for(int i = 0; i < N * N; i++) out[i] = i;

for(int i = 0; i < N; i++);

sum += in[i][i];

printF("%d", sum);

return 0;

}

 

 

 

해설

 

#define N 3  -> 진행되는 모든 N은 3이다.

malloc은 동적으로 메모리에 할당하는 함수(크기를 정해주는 함수)

in = (int(*)[N]) malloc( N* N * sizeof(int) ) -> 9개 짜리 배열을 만들고 세 덩어리로 자르겠다. (3행 3열짜리)

sizeof(int)는 저도 뭔지 모르겠습니다.

 

out = (int *) in;  -> out에 in의 배열포인터를 넘겨주겠다 -> 결국 in = out 같은 구조

36강

 

 

 

반응형