C/공부
C언어 - 포인터(1) (Pointer), &연산자, *연산자
Lewisjkim
2022. 2. 7. 21:17
포인터 = 특정한 데이터를 보관하는 변수
그렇다면 포인터는 어떤 특정한 데이터를 보관하는 것일까?
특정한 데이터가 저장된 주소 값이다.
그런 포인터에도 형(type)이 있는데,
정의는 (형)* (포인터 이름)으로 한다.
int* pointer; //int형 데이터의 주소값을 저장하는 변수 pointer
정의를 했으면 값을 집어넣어야 하는데 그건 바로
& 연산자를 사용하면 된다. 여기서 사용하는 기존 & 연산자와 다른 단항 연산자로 사용방법이 다르다.
& (주소 값을 계산할 데이터)로 표시해주면 된다.
#include <stdio.h>
int main() {
int a = 2;
printf("%p \n", &a);
return 0;
}
결과 값=
000000B1973CF664 //%p를=16진수 형태로 출력하라고 하여서 16자리인 16진수로 출력되었다)
고로 포인터에 적용시켜보면
#include <stdio.h>
int main() {
int* pointer;
int a = 2;
pointer = &a;//pointer는 a의 주소값이다
printf("포인터 pointer에 들어 있는 주소값은=%p \n", pointer);
printf("int 변수 a가 저장된 주소값은=%p \n", &a);
return 0;
}
결과 값=
위와 같이 출력되는 것을 확인할 수 있다.
한번 정의 된 변수의 주소 값은 바뀌지 않기 때문이다.
*연산자= 주소값에서 데이터를 불러오는 연산자 &연산자의 반대
#include <stdio.h>
int main() {
int* p;
int a = 2;
p = &a;
printf("%d\n", a); //데이터
printf("%d\n", &a);//주소 값
printf("%d\n", p);//주소 값
printf("%d\n", *p);//주소 값에 들어있는 데이터
return 0;
}
포인터에는
pointer *p;. 와 같이 pointer를 타입으로 사용하지 않는데 그런 이유는
컴퓨터가 *p의 메모리에서 몇 바이트를 읽어들어야 할지 알지 못하기 때문이다.
고로 int *p와 같이 사용하여 정확히 4바이트를 읽을 수 있게 해준다.