(C++) 포인터와 배열

TV[1]문자열 표현 방식의 이해 - 포인터가 표현하는 문자열 상수

이건 쫌 중요한문제입니다..ㅇ-ㅇ
문자열을 표현하실 때 어떻게 표현하시나요?

대부분 printf함수를 쓰거나 배열을 사용하여 표현하곤 합니다.
하지만, 포인터로도 문자열을 표현할 수 있다는 사실 알고 계셨나요~?

char string[5]="abcd";
char *pString[5]="ABCD"; //문자 ABCD를 가리킨다

<배열을 이용한 문자열 표현 string[5]="abcd";>


<포인터를 이용한 문자열 표현 pString[5]="ABDC";>



TV[2]문자열 상수에 대한 조금 더 깊은 이해

■ 위에서는 포인터로 문자열을 표현할 수 있는 대신에 상수(고정값)로 만 사용할 수 있다고 설명드렸습니다.
   여기에 덧붙여 설명드리겠습니다. 

  우선, 아래 두가지를 기억하세요!



■ 1. 문자열 상수는 메모리 공간에 할당되면 주소를반환한다.


-char *str = "ABCDEFG";


[*str이 짝사랑한 '주소값'... 그러나 예기치 못한 ABCDEFG라는 여인이 나에게 다가왔는데...]

사건의 전말은 다음과 같습니다.

 *str은 오른쪽에 있는 변수의 '주소값'이 오기를 대기하고 있음
하지만 주소값은 커녕 상수' ABCDEFG'가 와버렸음..
'*str'은 그래도 당황하지 않았음.. 나쁘지 않았던것임.. 생각보다 외모가 괜찮았음..
어떻게하면 ABCDEFG를 내 것으로 만들 수 있을까 순간 두뇌회전 RPM은 급상승함.
결론을 내림. 
우선, ABCDEFG에게 메모리공간(0x10번지)를 사줌. Give & Take 사회라 ABCDEFG도 나에게 뭔가를 주게 되어있음.
알고보니 ABCDEFG의 여동생이 주소값이였던것임. 따라서, *str은 ABCDEFG와 그녀의 주소값을 얻게 됨.

그래도 모르겠으면 아래 그림 보믄 댐..;;슬퍼2


<글 읽기 귀찮은 분들을 위한 그림 보충설명..^_^>


■ 2. 똑같은 문자열을 선언하면 한번만 메모리 공간에 할당된다.
(일부 컴파일러에만 해당)

혹요나 여러분의 컴파일러가 해당되지 않더라도 알고있으면 도움이 많이 될 것입니다.합체
말그대로 같은 문자열은 동일한 주소에 할당됩니다. 우선 예제를 보시겠습니다.
※주의사항 : 반드시 정확하게 일치하는 문자열이어야함
#include<stdio.h>

int main(void)
{
        char *str1="Good!";
        char *str2="Good!";

        printf("%d,%d\n",str1,str2); 
    return 0;
}



보시면 아시겠지만,두 포인터의 주소가 동일한 것을 확인 할 수 있습니다. 저의 컴파일러는 해당이되네요~ㅎㅎ





그렇다면!! 나는 두 가지의 포인터를 선언했는데 왜 메모리 공간에 하나만 저장이되는가!?

이는 바로 똑같은 코드라 할지라도 메모리를 효율적으로 사용하기 위한 메모리 최적화입니다. 

앞서 포인터는 문자열상수를 가질 수 있다고 했습니다. 어차피 똑같은 "Good"라는 문자이며, 변경이 불가합니다.

따라서, 같은 주소를 가리킨다고 한들 문제될건 없잖아요?? ㅎㅎ 

제컴은 똑똑한 컴파일러였음..!-☆

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기