지금까지의 데이터를 저장하기 위하여 변수를 선언한 것은 선언할 때 명시한 변수의 자료형의 크기에 따라 주기억장치를 할당받는 것이고 변수를 사용한다는 것은 변수에 할당된 영역에 값을 저장하거나 저장된 값을 읽어서 사용한다는 것을 의미한다.
int var;
var = 10;
printf("%d\n", var);
포인터는 주소를 저장하기 위한 변수다.
포인터를 사용하는 이유는 값을 간접참조(우회적으로 참조)하기 위한 것이다.
예시를 보자. 아래 예시는 위의 예시와는 다르다.(위의 예에서 var을 직접 사용하지 않고 *ptr을 사용하여 간접 참조한다.)
int *ptr;
ptr = &var;
printf("%d\n", *ptr);
여기서 포인터 연산자(*)와 주소 연산자(&)의 의미를 배워보자.
포인터
char *p_chr;
int *p_int;
double *p_dbl;
char *p_chr; >> p_chr이 가리키는 곳에 char형 값이 있다.
char *p_int; >> p_int이 가리키는 곳에 int형 값이 있다.
char *p_dbl; >> p_dbl이 가리키는 곳에 double형 값이 있다.
주의!!
주소의 크기는 같으므로 포인터의 크기는 같다.
printf("문자형과 포인터의 크기: %d, %d\n", sizeof(char), sizeof p_chr);
printf("정수형과 포인터의 크기: %d, %d\n", sizeof(int), sizeof p_int);
printf("실수형과 포인터의 크기: %d, %d\n", sizeof(double), sizeof p_dbl);
// 문자형과 포인터의 크기: 1, 4
// 정수형과 포인터의 크기: 4, 4
// 실수형과 포인터의 크기: 8, 4
>> 포인터의 크기는 모두 4바이트(32비트 컴파일러일 경우)로 같다. 이유는 주소를 표현하는 크기는 같기 때문이다.
>> 예를 들자면 건물의 크기는 다양하지만, 주소의 길이는 비슷한 것과 같은 이치이다.
주소연산자 (&)
int amt, *p_amt;
amt = 100;
p_amt = &amt;
일반 변수 amt를 선언하고 포인터 연산자 *와 연산자 &를 사용하여 amt 변수의 시작주소를 p_amt에 저장하는 예시이다.
밑에 그림은 어떻게 흐름이 이어나가는건지 그림으로 나타낸 것이다.
amt의 시작주소가 1004인데 그거를 p_amt = &amt를 통해서 amt의 시작주소를 p_amt에 저장한다.
포인터 연산자 (*)
지금 현재 p_amt에는 amt의 시작주소인 1004가 저장되어 있는 것이다.
그렇다면 p_amt가 아닌 p_amt가 가리키는 곳을 참조하고 싶을 때는 포인터 연산자 (*)를 사용해야한다.
포인터는 자료의 시작주소만을 저장하고 있고 포인터의 자료형 크기에 따라 마지막 주소가 결정된다.
즉 p_amt는 정수형 포인터이고 4바이트를 참조하므로 시작주소는 1004번지이고 끝 주소는 1007번지가 된다.
*p_amt는 1004-1007번지의 값을 읽어오는 수식으로 p_amt로 amt를 간접참조한다.
따라서 amt == *p_amt 수식은 참이다.
'프로그래밍 > C,C++' 카테고리의 다른 글
포인터 예제 (0) | 2024.06.11 |
---|---|
다양한 함수와 변수의 참조 범위 (0) | 2024.05.30 |
문자열 처리 (0) | 2024.05.28 |
인수 전달하는 함수 (0) | 2024.05.28 |
인수 전달하지 않는 함수 (0) | 2024.05.27 |