2009년 8월 3일 월요일

개인적으로 헷갈렸던 C문법 정리 - 1

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;
}


위와 같은 예제를 돌려보고 이해하려고 해보면 도움이 될지도 모릅니다.

댓글 없음:

댓글 쓰기