신입 개발자 공부 과정

C언어 - 포인터(1) (Pointer), &연산자, *연산자 본문

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바이트를 읽을 수 있게 해준다.