728x90
IT 개발자 Note :: 22. 포인터(Pointer)와 배열(Array) (it-note.kr)
int arr[100];
int *ptr;
ptr = (int *)malloc(sizeof(int) * 100);
이렇게 두개의 변수를 선언했을 때
<포인터와 배열의 유사점>
1.배열 표기법으로 접근 가능
int i = 10;
printf("arr[%d] = %d\n", i, arr[i]);
printf("ptr[%d] = %d\n", i, ptr[i]);
2.포인터 접근법으로 표기 가능
int i = 10;
printf("*(arr + %d) = %d\n", i, *(arr + i));
printf("*(arr + %d) = %d\n", i, *(ptr + i));
<포인터와 배열의 차이점>
1.데이터 저장 공간
* 배열: 변수선언과 함께 데이터를 저장할 공간을 배열의크기만큼 연속적인 공간을 가짐
* 포인터: 자신이 데이터를 저장할 공간을 가지지 X / 저장할 공간이 있는 위치를 저장하는 메모리 번지를 저장
2.변수의 메모리 번지
포인터는 실제 메모리가 위치한 메모리변지의 주소와 메모리 포인터의 주소가다름
int arr[100];
int *ptr;
ptr = (int *)malloc(sizeof(int) * 100);
printf("arr = %p\n", arr);
printf("&arr = %p\n", &arr);
printf("ptr = %p\n", ptr);
printf("&ptr = %p\n", &ptr);
결과>
arr = 0x7fff0322adb0
&arr = 0x7fff0322adb0
ptr = 0x130b010
&ptr = 0x7fff0322ada8
(ptr은 실제로 메모리가 할당된 heap영역의 메모리번지가 할당됨 /
배열, 배열주소, 포인터 주소는 stack영역의 메모리번지)
3.포인터(변수) vs 배열(상수)
포인터와 배열 둘 다 변수 자체는 메모리 번지를 뜻하지만, (arr, ptr)
배열은 포인터 상수이므로 다른 번지를 가리킬 수 없다.
int tmp[100];
int arr[100];
int *ptr = arr;
ptr = tmp; // OK
arr = tmp; // Error
4.증감연산자 사용 여부
char arr[100];
char *ptr = arr;
ptr++; // 정상
ptr += 2; // 정상
arr++; // 오류
arr += 2; // 오류
배열이 상수이므로 증감연산자도 사용불가.
5.다차원 배열도 단일 포인터
배열은 차원에 상관없이 모두 메모리상에 연속적으로 데이터가 저장되고 관리됨
int arr[10][100];
int *ptr = (int *)arr; // warning 방지용
arr[1][4] = 256;
은
ptr[1 * 100 + 4] = 256;
또는
*(ptr + 1 * 100 + 4) = 256;
728x90
'CS > C++' 카테고리의 다른 글
오버로딩과 오버라이딩의 차이 (0) | 2023.12.13 |
---|---|
malloc/free와 new/delete의 차이 (0) | 2023.12.13 |
struct와 class의 차이 (0) | 2023.12.13 |
스마트포인터 / 사이클 해결 방법 (1) | 2023.12.08 |
버퍼 오버플로우 (0) | 2023.12.08 |