본문 바로가기

DEV

[C++] 포인터가 너무 어렵다.

php 를 주 언어로 사용하던 나에겐 포인터가 너무 생소하고 어렵다.


시작은 항상 쉽게 시작하지만 이걸 한번만 꼬아(?) 버리면 바로 머리속에 들어오지 않고

한참을 고민해야 머리속에 들어온다. 심지어 이해가 가지 않을때도 있다.


char k = 'a';

char y[5];

char* cp;


이건 char 형의 주소를 기억하는 cp 라는 변수명이다.

저곳에는 주소만 기억이 된다.

char 형 변수 k 에는 'a' 가 저장되어 있다.

char 배열형 변수 y 에는 5개의 메모리 주소가 저장되어 있다.


*y = k;


y 엔 첫번째에 a 가 저장되고 나머지 4개의 주소에는 나도 모르는 값들이 저장되어 있다.


cout << y;


해서 출력을 해 보면 나 같은 경우는


ajy??


이런 값이 출력됐다. a 는 내가 저장한 내용. 나머지는 이전에 메모리에 있던 값이다.

여기까지 오는것도 몇번 헤깔렸다. k 는 주소 하나를 가진 char 형 변수 이기 때문에 a 라는 문자열 하나가 저장되어 있고

y 에는 5개의 주소를 가지는 char 형 변수다.

k 를  y 에 대입할때


y = k;


는 에러가 난다. y 는 주소를 기억하고 있단다. 그래서 y 에 대입시킬땐


*y = k;


이렇게 해야 대입이 된다. 게다가 y 변수에는 시작주소가 기억되어 있기 때문에

시작되는 주소에 k 의 내용이 써진다.

*y 하는 이유는 ? y 는 주소 값이기 때문에 그것의 내용이라는 뜻에 * 를 붙인다.

결국 y = k 의 내용은 k 의 값을 y 의 주소에 넣어라. 인데 값을 주소에 넣을수 없게 되어 있다.

그래서 오류가 난것이고 k 앞에 * 를 붙여 줌으로써.

y 주소의 값에 k 값을 넣어라 라고 시키면서 저장이 된것이다.


그리고 다음. 


char* cp;


이 내용은 char 형 주소를 기억하는 변수 cp 를 가지고 있다. 하나의 주소만을 기억할수 있다.

그래서

cp = k;

는 작동을 하지 않는다. k 의 값을 cp 의 주소에 넣으려고 하기 때문에. k 를 cp 에 넣고 싶다면
주소를 지정하는 & 를 붙이면 된다.

cp = &k;

cp 를 cout 으로 출력하면 a 로 시작을 하는 5자리의 문자열이 출력된다.

근데 궁금한게 생겼다.


char* cp;


는 주소를 기억하고 있다.

*cp 는 cp 의 주소에 있는 값이라는 뜻이다.

그럼 cp 의 값을 출력하려면.

cout << *cp;

이거 아닌가 ??

또 헤깔리기 시작했다. 잠시 쉬었다...... 가야겠다....