[C++] 포인터와 배열의 차이.
배열은 선언과 동시에 정의를 해줘야한다.
그래서 보통 아래처럼 정의한다.
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" 이렇게 선언해야한다.