4. 짧은 팁:
(*&) 또는 (&*) 는 상쇄되어 사라집니다.
int main(void) {
int a = 4;
int *p = &a;
printf("%d %dn", *&a, a);
printf("%p %pn", &*p, p);
}
5. 이중 포인터 다시 보기
int x = 10;
int *ptr = &x;
int **pptr = &ptr;
6. 이중 포인터 다시 보기
/
- *는 연속해서 올 수 있지만 &는 안 됩니다.
- 이것보다는 그림이 더 명확합니다.
int x = 10;
int *ptr = &x;
int **pptr = &ptr;
/*
1) pptr = &ptr, ptr = &x
2) pptr = &ptr = &&x (아님)
2) *pptr = *(&ptr) = ptr
3) **pptr = **(&ptr) = *ptr = *(&x) = x = 10
*/
7. 배열과 포인터의 차이점
arr = &arr[0] = &*(arr +0) = arr 입니다.
이 때 arr 은 읽기 전용입니다!
int arr[] = {0, 1, 2, 3, 4};
int *ptr = arr;
ptr = ptr + 1; //ok, *ptr = 1;
arr = arr + 1; //error
9. 예제)
크기가 n인 int 배열에 0 ~ n – 1 까지
값을 초기화하는 함수를 작성하고 테스트하시오.
10. 예제)
크기가 n인 int 배열에 0 ~ n – 1 까지
값을 초기화하는 함수를 작성하고 테스트하시오.
void setArray(int array[], int n) {
}
int main(void) {
int arr[10];
setArray(arr, 10);
for( int i = 0; i < 10; i++)
printf(“%dn”, arr[i]);
return 0;
}
15. 예제)
크기가 n인 int 배열에 0 ~ n – 1 까지
값을 초기화하는 함수를 작성하고 테스트하시오.
void setArray(int *array, int n) {
for( int i = 0; i < n; i++)
array[i] = i;
}
int main(void) {
int arr[10];
setArray(arr, 10);
for( int i = 0; i < 10; i++)
printf(“%dn”, arr[i]);
return 0;
}
16. 예제)
크기가 n인 배열을 동적 할당으로 생성하고
0 ~ n – 1 까지 값을 초기화하는 함수를
작성하고 테스트하시오.
17. 예제)
크기가 n인 배열을 동적 할당으로 생성하고
0 ~ n – 1 까지 값을 초기화하는 함수를
작성하고 테스트하시오.
*array[i] 라고 하면 어떻게 될까요?
void setArray(int **array, int n) {
*array = calloc(n, sizeof(int));
for( int i = 0; i < n; i++)
(*array)[i] = i;
}
int main(void) {
int *ptr;
setArray(&ptr, 10);
for( int i = 0; i < 10; i++)
printf(“%dn”, (*ptr)[i]);
return 0;
}
19. 1.메모리는 1차원인데 2차원 배열을 어떻게 저장할까요?
왜 00, 01, 02, 10, 11, 12 순서로 접근할까요?
00, 10, 01, 11, 02, 12 순서도 상관없지 않나요?
int arr[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
int main(void) {
int arr[2][3] = { { 0, 1, 2 },
{ 3, 4, 5 } };
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
printf("%pn", &arr[i][j]);
}
20. arr[m][n] 배열을 1차원 포인터로 캐스팅하면
arr[m][n]; //m * n 배열
int *ptr = (int *) arr;
라면…
arr[i][j]
= *(ptr + i * n + j)
21. 예제) 2차원 배열과 단일 포인터
int main(void) {
int arr[2][3] = { { 0, 1, 2 },
{ 3, 4, 5 } };
// int *ptr = arr; warning!!
int *ptr = (int *) arr;
for (int i = 0; i < 2; i++){
for (int j = 0; j < 3; j++) {
printf("%d ", *(ptr + i * 3 + j));
}
printf("n");
}
}
22. 앞의 예제에서 알 수 있는 것처럼
이차원 배열과 단일 포인터는 서로 다른 타입입니다.
그럼 이차원 배열의 이름은 어떤 타입의 주소일까요?
int
조금 복잡하지만
-ptr 변수는 int 3개짜리 배열의 포인터입니다.
-이차원 배열은 1차원 배열의 배열이다.
int arr[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
int (*ptr)[3] = arr; //ok
23. 예제) 2차원 배열과 배열의 포인터
int main(void) {
int arr[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
for (int i = 0; i < 2; i++){
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(arr + i) + j));
}
printf("n");
}
}