Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

포인터의 기본 본문

프로그래밍 언어/C언어

포인터의 기본

세레프 2023. 2. 18. 03:13

 C언어는 컴퓨터의 메모리 주소를 이용해 메모리 안에 기억되어 있는 값을 제어할 수 있는 시스템 프로그래밍이 가능한 언어이다. 즉, 컴퓨터안의 메모리 주소에 접근이 가능하며, 그 안의 값을 제어할 수 있다.

 게다가 같은 변수명을 사용하더라도 함수나 실행문이 다르면, 변수의 주소가 다르기 때문에, 서로 다른 변수가 된다. 그래서 함수에서 다른 함수의 변수를 사용하기 위한 방법으로 주소를 사용한다. 

포인터

 포인터변수의 주소를 저장하는 공간으로, 변수를 사용할 때 변수의 이름이 아닌 주소로 접근하기 위해 사용한다.

포인터형 * 포인터변수명;

 위의 구조는 포인터를 선언하는 구조식으로, 포인터 변수에 변수의 주소를 저장할 때 사용한다. 이때 포인터형포인터 변수를 통해 변수에 값을 저장할 때, 포인터 변수가 받을 값의 형태를 정의한다. 그래서 주소에 저장할 변수의 자료형을 포인터 형으로 사용한다. 예를들면, int* px는 정수형 변수의 주소를 저장하기 위한 포인터 변수 px를 생성하는 코드이다. 

#include<stdio.h>

void main() {
	int* pa; 
	float* pb;
	char* pc;
	long* pd;
	double* pe;
	

	printf("sizeof(pa):%d\n", sizeof(pa));
	printf("sizeof(pb):%d\n", sizeof(pb));
	printf("sizeof(pc):%d\n", sizeof(pc));
	printf("sizeof(pd):%d\n", sizeof(pd));
	printf("sizeof(pe):%d\n", sizeof(pe));
}

 코드와 결과를 보면, 각각 다른 자료형을 통해 포인트를 생성했음에도 변수의 크기가 4byte로 고정되어 있는것을 확인 할 수 있다. 이는 주소값은 양의 정수형 숫자값을 가지기 때문에, 정수형인 4byte를 가지는 것이다.

 

포인터의 저장과 초기화

 포인터도 변수와 같이 대입과 초기화가 가능하며, 변수의 저장, 초기화 방법과 유사하다.

포인터명 = &변수명;

 위의 방법은 포인터의 저장하는 방법으로, 변수에 값을 저장하는 형식과 유사하다. 다만 값은 변수의 주소로 고정되어 있다는 것이 차이점이다.

포인터형 * 포인터 변수명 = &변수명; 

 위의 방법은 포인터의 초기화 방법으로, 변수에 값을 초기화 하는 형식과 유사하다. 다만 저장형식과 마찬가지로 저장하는 값이 변수의 주소로 값이 고정되어 있다.

 

포인터기호와 간접 참조 연산자 : *

#include<stdio.h>

void main() {
	int a = 10;
	int* pa = &a;

	printf("직접연산:%d\n", a);
	printf("간접연산:%d\n", *pa);

	printf("&a=%d\n", &a);
	printf("pa=%d\n", pa);
	printf("&pa=%d\n", &pa);
	printf("&*pa=%d\n", &*pa); //포인터 변수pa로 접근한 값의 주소값

}

 위의 코드를 보면, 포인터를 초기화할 때,  "*"를 사용하는 것을 볼 수 있다. 이는 포인터기호로, "해당 변수는 포인터로 한다"는 뜻을 가지고 있다. 즉, int px는 "px라는 변수를 만드는 것"이고, int* px는 "px라는 포인터를 만든다."는 뜻이다.

 

 반면 printf함수를 사용할 때도, 출력값에도 "*"를 사용하는 것을 알 수 있다. 이것은 초기화 할 때, 사용하는 "*" 와 다른 것으로, 간접 참조 연산자라고 한다. 이것은 "해당 포인터에 있는 주소값에 접근하여, 변수의 값을 가져온다"는 뜻으로 사용된다. 즉, *pa는 "pa에 저장되어 있는 주소인 변수 a의 주소에 접근하여, 변수 a의 값을 가져온다"는 뜻이다. 다르게 말하자면 "*pa의 값은 변수a의 값과 같다(*pa == a)"는 것이다.

'프로그래밍 언어 > C언어' 카테고리의 다른 글

배열과 포인터  (0) 2023.02.21
포인터 연산  (0) 2023.02.19
다차원 배열  (0) 2023.02.17
배열  (0) 2023.02.16
함수와 변수  (0) 2023.02.15
Comments