C Language의 Character
C언어에서의 Charcater = 즉 char
는 하나의 문자를 가르키는 Type
Character Pointer
char *
의 Type은 char
의 주소를 나타내는 Type
Character Array
char temp[6] = "Hello"
에서 temp
는 char
Type이 6개 (마지막 NULL
문자 포함) 있는 배열이고
배열명은 해당 배열의 시작 주소를 가르키는 상수이다.
즉 temp
와 &temp[0]
는 같은 값을 가르킨다.
Array? Pointer?
우리는 *
을 포인터 변수 앞에 붙여서 해당 포인터가 가르키고 있는 값을 "참조" 할 수 있다.
또한 &
을 변수 앞에 붙여서 해당 변수의 "주소"를 알 수 있다.temp
는 배열의 주소를 가르키는 "상수"이므로 우리가 임의로 변경 할 수 없다.
차이점
여기서 Array와 Pointer의 차이가 나타나는데,char arr[] = "Hello"
로 정의하는 것(배열로 정의)char *p = "Hello"
을 이용해 정의하는 것(포인터로 정의)은 근본적인 차이가 존재한다.
둘의 공통점은 "Hello"와 같은 문자열은 컴파일시에 문자열 리터럴로 ROM에 저장되게 되는데
그 이후가 다르게 작동한다.
Array로 정의
배열로 정의하게 되면 컴파일 시 ROM에 "Hello"라는 문자열을 저장해둔다음,
"Hello"라는 문자열을 담기 위한 공간을 RAM에 생성하고 거기에 문자열을 ROM에서 "복사"해온다.
즉 사용자가 수정하는 것이 자유로워서 arr[2] = 'a'
로 바꿔서 Healo
가 될 수 있는 것 이다.
Pointer로 정의
포인터로 정의하게 되면 컴파일 시 ROM에 "Hello"라는 문자열을 저장해두는 것 까지는 같으나,p
는 ROM에 있는 문자열을 가르키는 주소를 담고 있을 뿐이므로, 해당 값을 변경하는 것은 불가능하고,
만약 가능하다면 ROM이 수정되는 것이므로 매우 위험하다.
= 애초에 포인터는 단순 주소이므로 그 앞뒤로 무슨 값이 들어있을지도 모르기 때문에 항상 포인터를 다룰때는 주의 해야한다.