p는 int *p 형식으로 정의되어 있으므로,
int * 형식(메모리주소값.&) 만 들어갈 수 있다.
여기에 p=70과 같이 int값을 넣어버리면 오류가 난다
포인터는 변수다.
자신의 자료형과 일치하는 변수의 주소를 저장한다.
(int*p 는 int의 주소만 저장하고, str의 주소는 저장할 수 없다.)
통상적으로 int의 크기는 4byte 이므로 4byte로 가정하고,
주소값은 (편의상 10진법으로) 임의로 &a = 100, &p = 500 으로 설정한 경우,
[참고로 여기서 가정한 주소값은 실제로는 저렇게 대입하면 정수와 주소값의 자료형이 다르므로 불가능함. 편의상 주소값을 10진수로 표기]
a[2] = *(a+2) | |
&a[2] = a+2 | |
배열식 표현 | 포인터식 표현 |
int* p = int *p (별 위치는 무관하게 인식함)
int* p = a 인 경우, a[2] = *(a+2) = *(p+2) = p[2] (a를 완전히 대체할수 있다.)
a [ 2 ] = 30 (O) 내부 값을 가리킴
*(a+2) = 30 (O) 위와 동일한 내용을 다른 방식으로 쓴것임(포인터식으로)
a = 30 (X) a는 상수라 변경불가.
a = a+1 (X) a는 변수가 아닌 상수라서 변경이 불가능하다.
p = p+1 (O) 포인터는 주소값을 가진 다른 값으로 변경 가능함.
단, 주소값의 타입(int의 주소인지, char의 주소인지등) 까지 동일해야만 한다.
p = a+1 (O) 그러나 a도 주소값(첫칸의 주소)을 가지고 있어서 p에 대입은 가능하다.