배열포인터는 배열의 시작주소값을 저장하는 포인터인데 편하게 배열의 주소가 들어간다고 생각하면 됩니다.
우리가 배열의 주소를 넣을때는 배열의 대표값을 넣는데 그게 첫번째 값이니까 시작주소값을 저장하는거라 생각하면 되는것~!
배열포인터는 포인터를 배열처럼 쓸 수 있는데 보통 2차원배열에서 쓴다. 혹은 2차원 배열을 매개변수로 받을 때 쓴다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include<stdio.h>
#include<limits.h>
int main() {
char arr[3][7] = { "가나다", "ABC", "포인터" };
char(*data)[7];
data = arr;
for (int i = 0; i < 3; i++) {
printf("%s\n", *(data + i));
int arr[2][3] = {
{1,2,3},
{4,5,6}
};
int(*ptr)[3];
ptr = arr;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", ptr[i][j]);
}
printf("\n");
}
}
|
cs |
ptr을 arr처럼 쓸 수 있다!
1차원 배열포인터와 2차원 배열포인터
자 여기서 궁금증이 생긴다.
1차원 배열포인터를 출력할때는 역참조가 필요한데
2차원 배열포인터 출력할때는 역참조를 안한다.
아니 배열포인터에 주소값이 들어가면 2차원 배열포인터도 역참조를 해야하는거 아니에요??? 싶다. 이제부터
이유를 설명하겠다.
1차원 배열포인터
ptr[1]과 (*ptr)[1]의 차이부터 알아보자.
ptr[1]은 *(ptr+1) ==*(&arr+1)인데 &arr+1을 하면 아예 다른 배열을 가리킨다.
실제로도 &arr[0]과 ptr[1]을 같이 출력해보면 두 주소값의 차이가 12바이트인것을 알 수 있다!
arr배열 전체에서 1을 더해준것은 아예 다른 지역으로 넘어간것을 의미한다고 보면 된다!
(*ptr)[1]은 (*&arr)[1]인데 *랑 &만나면 소거가 된다! 즉 arr[1]을 가리킨다.
이러한 이유때문에 1차원배열포인터에서 원소에 접근할때는 꼭 *를 써주도록하자.
2차원 배열 포인터
2차원 배열 포인터는 애초에 역참조를 두번해주기 때문에 *가 필요없다!
교수님이 설명해주시래도 실제로 2차원 배열들의 포인터를 배열포인터라고 하셨다.
arr[i][j]는 실제로 컴퓨터가 인식할 때 *(*(arr+i)+j) 로 인식하는데 여기서 역참조 두번이라는 말이 나온거다! 더 자세히 알아보자~
예를 들어 ptr[2][1]의 값을 알아본다고 해보자.
자 int(*ptr)=arr이다.
그러니까 ptr에는 &arr[0]이 들어있는거다
ptr[2][1]을 해부해보면 *(*(ptr+2)+1)이 되는데
*(ptr+2)부터 보면 *(&arr[0]+2)는 *(arr+2)가 되면서 *(&arr[2]) == arr[2]가 된다.
어라랏 arr[2]도 배열이다. 그러면 얘도 사실상 &arr[2][0]를 가리킨다.
*(&arr[2][0]+1) ==*(&arr[2][1]) 이 되면서 ptr[2][1]은 arr[2][1]이다.
난이도 극악
이 칭구를 이해해보자.
자 우선 row는 배열포인터다. 우선 arr[0]이 여기에 들어갈건데 arr[0]은 배열이다.
그니까 row에는 arr[0] 배열의 주소값 &arr[0]이 들어있다.
int* col=*row를 하면 *(&arr[0])이 되면서 col은 arr[0]을 가리키는데 arr[0]은 결국에 배열이기때문에
사실상 arr[0]은 &arr[0][0]과 같다고 봐도 된다.
아 그래서 arr[0][0]+1 하면 arr[0][1]되고 arr[0][0]+2하면 arr[0][2]되면서
궁극적으로 *col은 arr[i][j]에 해당하는 값들을 출력하는 것이다!
2차원 배열 매개변수로 전달
1) 배열 포인터를 쓴다.
2) float arr[][2] 을 매개변수로
공백을 사용하는 방법도 있다.
'C > 기말고사 대비(2022 1학기)' 카테고리의 다른 글
[C언어 시험대비] 2020년 기말고사 기출 (0) | 2022.06.11 |
---|---|
[C언어 시험대비] 2016년 기말고사 기출(3) (0) | 2022.06.11 |
[C언어 시험대비] 16년 기출(2) (0) | 2022.06.11 |
[C언어 시험대비] 16년 기말고사 기출 (1) (0) | 2022.06.11 |
[기말고사 기출문제 풀이] 2016년 기말(가) (0) | 2022.06.08 |
댓글