관리 메뉴

공부 기록장 💻

[C언어] 포인터 본문

# Language & Tools/C

[C언어] 포인터

dream_for 2021. 2. 7. 04:04

 

포인터의 개념과 주소 연산자 &

 

- 포인터: 메모리의 주소를 가지고 있는 변수

- 변수는 메모리에 저장된다. 메모리는 바이트(byte) 단위로 주소가 매겨져 있는데, 주소를 이용해 메모리에 접근하며 값을 읽고 저장할 수 있다. 변수의 주소는, 변수가 차지하는 바이트의 주소 중에서 가장 낮은 주소가 된다.

- 주소 연산자 &: 변수의 이름을 받아 변수의 주소를 반환하는 연산자

  • 형식 지정자 16진수 출력- %p, 부호 없는 10진수 출력- %u

 

 

포인터의 선언과 초기화

 

- 포인터(pointer) 의 선언: (포인터가 가리키는 대상과 동일한 자료형) * (포인터 이름=포인터 변수명)

 

  • 포인터 타입과 변수의 타입은 일치해야 함! 포인터에 의하여 참조되는 객체의 크기와 형식을 결정하는 것이 포인터의 타입이기 때문

- 포인터의 초기화: & 연산자를 이용하여 변수의 주소를 계산하여 포인터에 대입

 

int *p = NULL; // int형 포인터 p 선언 (0, NULL 값으로 초기화해주기!)
int i = 10; // 10의 값을 갖는 int형 변수 i 선언
p = &i; // i의 주소를 대입 -> 초기화

// int *p = &i; 

- 포인터 변수가 가리킬 대상을 미리 알지 못하는 경우, 0이나 NULL 값으로 초기화해준다.

- 위 예시에서 포인터 p는 i의 주소를 저장하고 있다. 

 

 

 

간접 참조 연산자 *

 

- 포인터를 이용하면 주소를 이용하여 직접 컴퓨터의 메모리에 접근하여 메모리를 조작할 수 있다.

- 간접 참조(dereferencing, indirection): 포인터가 가리키는 주소에 저장된 내용을 읽는 것

 

 

* 기호는 포인터 변수를 선언할 때 뿐 아니라 가리키는 값에 직접 접근하여 값을 읽고 변경할 수도 있다.

 

int *p = NULL; 
int i = 10;
p = &i;


printf("*p = %d, i = %d\n", *p, i); // 포인터 p가 가리키는 값 = i에 저장되어 있는 값
printf("p = %d, &i = %d\n", p, &i); // 포인터 p의 값 = i의 주소값

*p = 20; // p가 가리키는 값을 20으로 변경(i의 값 변경)

printf("i = %d\n", i);

 

 

 

 

- 예시를 통해 i의 주소를 저장하고 있는 포인터 p는 * 연산자를 이용해 가리키는 값에 직접 접근할 수 있음을 확인할 수 있다. *p는 i의 값과 동일, p의 값은 i의 주소와 동일.

- 포인터는 변수이므로, 저장된 주소를 다른 값으로 언제든지 변경 가능하다. 또한, 가리키는 변수의 값을 직접 변경할 수도 있다. 

 

- 일반적으로 메모리 관리는 운영 체제의 고유한 권한이므로, 아두이노와 같은 임베디드 시스템을 사용하는 경우가 아니라면 직접 주솟값을 포인터에 대입할 수 없다.

 

 

 

포인터의 연산, 증감 연산자

 

- 포인터의 덧셈, 뺄셈을 이용하여 포인터가 가리키는 값에 편리하게 접근하여 참조할 수 있다.

- 일반적인 변수에 대한 연산과는 조금 다르게, 증가하고 감소하는 값은 포인터가 가리키는 객체의 크기이다. 

#include <stdio.h>

int main(void) {
	
	int i = 10;
	int list[5] = { 1,2,3,4,5 };
	char c = 'a';
	char s[] = "Hello";
	
	int* pi = &i;
	int* pi2 = list;

	char* pc = &c;
	char* pc2 = s;

	printf("pi = %d, pi2 = %d, pc = %d, pc2 = %d\n", pi, pi2, pc, pc2); // 각 포인터(주솟값)의 값
	printf("*pi2 = %d, *pc2 = %c\n\n", *pi2, *pc2); // pi2와 pic2가 가리키는 값

	// pi2와 pic2의 값을 1 증가 (가리키는 객체의 크기만큼 주솟값 증가)
	pi2++;
	pc2++;

	printf("pi2 = %d, *pi2 = %d\n", pi2, *pi2); // pi2와 pi2가 가리키는 값
	printf("pc2 = %d, *pc2 = %c\n", pc2, *pc2); // pic2와 pic2가 가리키는 값

}

 

- 포인터에 정수형 변수 i와 문자형 변수 c의 주소를 대입하려면, & 주소 연산자를 사용하여야 한다.

- 배열을 포인터에 의 이름은 포인터이다. (배열이 시작하는 주소가 곧 포인터를 의미하다.)

 

포인터 형변환

 

 

포인터와 함수

 

 

포인터와 배열

 

 

 

728x90
반응형
Comments