배열포인터란?
배열의 시작 주소값을 저장할 수 있는 포인터 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강
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 함수, 반복문 예제 (0) | 2022.06.21 |
---|---|
[정보처리기사] C언어 - 함수의 기본 (swap함수 예제) (0) | 2022.06.20 |
[정보처리기사] C언어 - 구조체, 포인터 구조체.. (0) | 2022.06.17 |
[정보처리기사] C언어 - 포인터 배열(배열 포인터와 포인터 배열 차이) feat. 문제로 강화하기 (0) | 2022.06.13 |
[정보처리기사] C언어 - 2차원 배열과 포인터 (0) | 2022.06.13 |