C언어를 사용 하는 사람들에게 배열과 포인터는 익숙하다 못해 지겨운 친구들입니다. 그러다 보니 소홀히 여기게 되죠. 그 소홀함에 의해 발생한 지난 에러들에 반성하며 포인터와 배열을 비교,정리해 봅니다.
배열 형식과 포인터 형식
배열 : char arr[] = "123456789";
포인터 : const char *parr = "123456789";
배열 형식 - arr[]
10개(9개의 문자와 1개의 널 문자'\0')의 원소를 가진 배열을 컴퓨터 메모리에 할당한다. 각각의 원소는 대응하는 문자로 초기화 된다.
일반적으로, 큰따옴표로 둘러싸인 문자열은 실행 파일의 일부인 데이터 세그먼트에 저장된다. 프로그램이 메모리에 적재될 때 그 문자열도 함께 적재된다.
이때 큰따옴표로 둘러싸인 문자열은 정적 메모리에 있다고 한다.
이 배열을 위한 메모리 할당은 프로그램의 실행이 시작된 후에 이루어지다. 큰따옴표로 둘러싸인 문자열이 이 배열에 복사된다.
그때부터 컴파일러는, 이름 arr를 첫 번째 배열 원소의 주소인 &arr[0]의 동의어로 인식한다.
여기서 중요한 것은, 배열 형식에 사용된 arr가 주소 상수(address constant, 변하지 않음)라는 점이다. arr를 변경한다는 것은, 배열이 저장된 위치를 변경한다는 것을 의미하기 때문에 허용되지 않는다.
arr + 1은 허용 되어도, ++arr는 허용 되지 않는 것이 이러한 이유이다. arr + 1은 배열의 다음 원소를 나타내지만, ++arr는 주소의 변경을 의미한다.
증가 연산자는 상수가 아니라 변수 이름에만 사용할 수 있다.
포인터 형식 - *pArr
포인터 형식또한 문자열을 38개의 원소로 정적 메모리에 저장한다.
덧붙여, 프로그램이 실행을 시작하면, 포인터 변수 pArr를 위한 위치를 하나 더 할당받고, 그 변수에 문자열의 주소를 저장한다. 해당 변수는 초기에 문자열의 첫 번째 원소를 가리킨다. 그러나 이 값은 변경가능한 값이다.
고로 증가연산자가 사용가능하다. 예를 들어 pArr++은 두 번째 문자(2)를 가리키게 된다.
요약하면, 배열의 초기화는 정적 메모리의 배열로 그 문자열을 복사한다.
반면 포인터의 초기화는 문자열의 주소만을 복사한다.
arr는 변경 불가능. arr[0]은 변경 가능
parr는 변경 가능, parr[0] 또한 변경 가능
참고 : C 기초 플러스
'IT > C(C++)' 카테고리의 다른 글
[c++] 문자열 함수 정리(char 배열과 string) (0) | 2020.09.02 |
---|---|
[C++] STL container 간단 정리 (0) | 2020.07.07 |