1.
#include <stdio.h>
// 2차원 배열과 배열 포인터
int main() {
int arr[2][3] = { { 1, 2 ,3 }, {4, 5, 6} };
// arr = &arr[0] , ptr = arr > ptr = &arr[0] > ptr = arr[0]
for (int(*row)[3] = arr; row < arr + 2; row++) {
for (int* col = *row; col < *row + 3; col++) {
printf("%d", *col);
}
printf("\n");
}
int *col = *row
*row가 그 행의 첫번째 칸의 포인터가 돼야 하는 이유?
row가 행 전체의 포인터라면 *row는 행 전체 그 자체가 되어야 할텐데?
포인터는 주소.
배열을 가리킨다고 해서 주소 배열을 만들지 않는다.
배열 중에서 하나의 주소를 선택해서 그 배열의 대표 주소로 만든다.
아무래도 첫번째 주소가 배열의 주소가 되는 것이 상식적임
row가 행 전체의 포인터이든, 배열 전체의 포인터이든 포인터는 대표 주소 하나만 나타냄
포인터 변수 row에 저장 된 arr(&arr[0])는 0번째 행이다.
row++는 row + 1 = &arr[1]가 되어 1번째 행이다.
포인터 변수 col 에 저장 된 *row는 *(&arr[0][0]) 이며 이것은 0 * 0 의 주소에 저장 된 값을 가져온다.
*row 가 아닌 row를 넣으면 배열 자체를 가져오게 되는 것
*(&row)[0] row의 0번째 인덱스 값을 가져와라
2.
#include <stdio.h>
//#. 30 배열과 포인터 종합문제
int main()
{
//arr의 주소값은 100이라 가정
int arr[3][3] = { 0 };
printf("%d\n", &arr); // 100
printf("%d\n", arr); // 100
printf("%d\n", *arr); // 100
printf("%d\n", &arr[0]); // 100
printf("%d\n", arr[0]); // 100
printf("%d\n", *arr[0]); // 0
printf("%d\n", &arr[0][0]); // 100
printf("%d\n", arr[0][0]); // 0
}
'예제 > C' 카테고리의 다른 글
1. 배열과 포인터 예제 (0) | 2020.02.12 |
---|