1. 주소와 포인터는 상수와 변수 차이와 같다.
1) 포인터는 변수처럼 공간으로도 사용할 수 있지만, 주소는 상수처럼 정해져 있는 값만 사용할 수 있지 공간으로는 사용할 수 없다. 예를 들면 C언어에서 등호(=) 좌측에 공간이 오고, 등호 우측에는 값이 온다. 이때 주소 값 자체는 좌측(L-value)로 올 수 없다.
#include <stdio.h>
int main(void){
int a = 1;
int *pa = &a; // 포인터는 변수와 같아서 L-value로 쓰이는 것이 가능하다.
&a = 100; // 주소는 상수 값이라 L-value로 쓰이는 것이 불가능하다.
return 0;
}
(위 예시는 보여주기 위함으로 작성한 것이라 실제 컴파일하면 오류를 가져온다)
2) 둘 다 산술 연산자는 사용 가능하다.
2. 포인터의 크기는 주소의 크기와 같다.
1) 먼저 포인터 변수는 주소를 저장하는 변수이다. 예를 들어 int형으로 선언된 a라는 변수가 100번지 주소에 할당 되어있는 변수라면, 이 값을 포인터 변수 pa에 대입시켰을 때 pa는 100이라는 값을 갖게 되는 것이다.
여기서 100은 단순 '정수'가 아니라 '주소'로 분류되어 있는 데이터이다. 이 주소를 pa에 대입했고, 이 또한 변수이므로 pa가 차지하는 공간의 주소도 할당 받는다. 즉 pa의 데이터 값은 100이고, pa의 주소는 따로 있다. 이 말은 포인터 변수도 주소를 갖고 있다는 뜻이다. pa 안에 들어 있는 a의 주소값은 선언된 형태와 상관 없이 다른 주소들과 크기가 같고, 이 주소를 넣은 포인터 변수 또한 크기가 같다. int* 든 double *든 크기는 (32bit 기준으로) 4 byte로 같다는 의미이다. 물론 이 포인터 변수들이 가리키는 변수의 크기는 각각 (int) 4 byte와 (double) 8 byte이지만 말이다.
주소값은 컴파일러마다 다를 수 있으므로 sizeof() 연산자로 확인하자.
2) 포인터는 가리키는 자료형이 일치할 때만 대입해야 한다. 서로 읽어드리는 데이터가 다르므로 충돌을 일으킬 가능성이 굉장히 높다.
3. 함수는 오직 한 가지 값만 반환 시킬 수 있으므로 두 개 이상의 변수를 반환 받으려면 포인터를 사용해야 한다.
1) 인수로는 몇 개든지 받을 수 있지만, 반환 값은 무조건 한 개이다.
2) main에서 선언된 두 지역 변수의 값을 바꾸는 함수 swap()을 실행하려면 꼭 두 변수의 주소를 인수로 줘야한다. 주소 연산을 하기 때문에 반환 받을 필요는 없다.
'C언어' 카테고리의 다른 글
혼공c 함수의 매개변수 자리에 배열을 선언하는 경우 (0) | 2021.08.31 |
---|---|
[백준] 2588번 : 곱셈 c언어 (0) | 2021.08.27 |
[혼자 공부하는 C언어] 새롭게 시작하는 c언어 정리 210816 (0) | 2021.08.17 |
[모두의 C언어] <2장> 3주 동안 C언어 부시기 요약(7월 1일~7월 21일) (0) | 2021.07.16 |
[모두의 C언어] <1장> 3주 동안 C언어 부시기 요약(7월 1일~7월 21일) (0) | 2021.07.16 |