CS/C++

포인터와 배열의 차이

혀니리리 2023. 12. 13. 12:00
728x90

IT 개발자 Note :: 22. 포인터(Pointer)와 배열(Array) (it-note.kr)

 

22. 포인터(Pointer)와 배열(Array)

일반적으로 포인터를 사용하는 목적은 동적으로 메모리를 할당하여 사용하기 위해서 사용합니다. 그리고 메모리가 할당된 후에는 배열처럼 사용하면 된다고 이전에 설명하였습니다. int arr[100];

www.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