1. char* a = "Hello!";
/
2. char a[] = "Hello!";
두 선언법의 차이점.
char* a = "Hello!";
1. const char* a와 유사하다.
2. stack에 미리 자리 잡은 "Hello!"에 대한 주소를 가리킴.
3. a가 가리키는 주소내의 멤버변수에 대해 임의변경이 불가능함.
4. a가 다른 주소를 가리킬수 있도록 변경할 수 있음.
ex) a = "World!"와 같은 방식으로도 변경가능.
5. 단, 임의의 배열에 접근 시키는 경우에는 멤버 변수에 접근 가능.
char a[] = "Hello!";
1. stack내에 초기화 할 문자의 갯수만큼 메모리를 잡고, 문자열 상수 "Hello!"를 선언된 배열 a에복사함.
2. a가 가리키는 주소를 임의로 변경할수 없음.
3. 그러나 a가 가리키는 주소내의 멤버변수는 임의로 변경이 가능함.
4.
char a[] = "Hello!";
char* const b = a;
와 같은 방식은 b와 a의 sizeof값(char[7], char*)만 다를뿐 같은 역할을 하는 변수가 된다.
왜 이 문자열 상수에 대한 문법이 개인적으로 헷갈렸냐면
1. 문자열이 저장되는 메모리가 어딘지에 대한 인식부족
(string constant와 array of character이 가지는 의미)
2. []연산자와 *연산자가 실제 연산 활용에 있어서는 같다고 배웠지만,
선언때는 다르게 쓰인다는걸 인식을 못했음.
문자열 상수가 data영역에 저장된다는걸 제대로 인식한다면 헷갈리지 않을 문제였음.
복학을 대비해서 돌머리가 된 머리를 좀 유연하게 살릴겸 해서 C, C++에서 개인적으로 헷갈렸던 문법만 한번 훑어보며 정리해가기로 했습니다.
보면서 도움이 되도 좋고... 안되도 딸딸이 블로그니까 상관업코...
번외편
const char a[] = "Hello";
Hello는 data영역에서 stack으로 복사되고
stack에 있어서 지역변수로 선언한 경우에는 함수종료시에 소멸됨.
저장되는 데이터 영역만 stack에 있고 또다른 문자열 상수의 선언방법이 되겠습니다.
메모리는 두번이나 쓰겠지만요...
static const char a[] = "Hello";
같은 data영역에 저장되는데 가리키는 위치만 다른 방법이 되겠습니다.
이런걸 메모리 낭비라고들 말하죠 ....
#include <stdio.h>
int main(){
char c[] = "sxaxfg";
char* b;
char* const a=c;
static const char d[]="Hello!";
b = "Hsax";
b = "ocama";
b = "Hello!";
a[0] = 'o';
puts(c);
printf("%d, %d\n",sizeof(a),sizeof(c));
printf("%x, %x, %x\n", "Hello!", d, b);
return 0;
} |
위와 같은 예제를 돌려보고 이해하려고 해보면 도움이 될지도 모릅니다.
댓글 없음:
댓글 쓰기