Game Develop

[C++] 포인터와 배열의 차이. 본문

C++/C++

[C++] 포인터와 배열의 차이.

MaxLevel 2022. 10. 8. 20:43

 

배열은 선언과 동시에 정의를 해줘야한다.

그래서 보통 아래처럼 정의한다.

 

int arr[30]; 

int arr[]; // Error.

 

그리고 선언된 배열은 포인터변수와 다르게 상수이다. 해당 변수에 다른 값을 대입하지 못한다.

값을 대입하려 할 경우 l-value가 아니라며 컴파일에러가 뜬다.

이런점만 빼면 거의 대부분이 유사하긴 하다.

 

이외에 차이점을 좀 더 나열하자면 아래와 같다.

 

1. sizeOf를 사용할 때.

 

sizeof(포인터변수)

-> 포인터변수의 크기가 리턴된다. 포인터변수의 크기는 32bit컴파일러인지, 64bit컴파일러인지에 따라 다르다.

 

sizeof(배열) 

->  배열전체의 총 크기를 변환한다. int arr[3]인 경우, sizeof(int) * 3이 될 것이다.

 

 

2. 문자열

 

문자열을 char의 배열에 선언,정의 할 때와 char*에 선언,정의할 때 꽤 큰 차이가 있다.

 

char arr[] = "abcdefg"; 

 

위와 같은 경우, arr은 스택메모리에 할당되어있기 때문에 자유롭게 접근해서 값을 변경하는 등의 작업이 가능하다.

arr[2] = 'a' 등등...

 

그러나 

char* temp = "abcdefg";

라고 선언할 경우, abcdefg는 스택이 아닌 메모리구조중 하나인 Data섹션에 ReadOnly로 저장되어진다.

그렇기 때문에 배열처럼 접근해서 값을 변경하는게 불가능하다. 

 

애초에 최신버전의 C++인 경우, char* temp = "abcdefg"; 로 선언할 경우 컴파일에러를 띄워버린다.

abcdefg는 어차피 ReadOnly에 저장되기 때문에 앞에 const키워드를 붙이라고 에러를 띄운다. 

그래서 애초에

const char* temp = "abcdefg"  이렇게 선언해야한다.