728x90

포인터(Pointer)

: 프로그래밍 언어에서 다른 변수의 메모리 주소를 가리키는 변수

  • 다른 언어와는 차별화된 C만의 특징
  • 포인터를 이용하면 직접 메모리 내용에 접근하여 조작할 수 있다.
  • 포인터는 메모리의 주소를 의미한다.
  • 포인터 변수는 메모리의 주소 값을 저장하는 변수이다.└ (데이터가 저장된 곳, 즉 메모리 주소를 가진다.)

 

  • 메모리 매핑 하드웨어
    : 외부 장치를 메모리처럼 접근할 수 있다.
  • 참조에 의한 호출
    : 함수 외부 변수의 수정과 여러 개의 값을 반환할 수 있다.
  • 동적 메모리 할당
    : 프로그램 실행 도중 메모리를 할당할 수 있다.

 

변수와 메모리

  • 변수의 크기에 따라서 차지하는 메모리 공간이 달라진다.
  • char 형 변수 : 1바이트
  • int 형 변수 : 4바이트

 

변수의 주소

  • & : 변수의 주소를 계산하는 연산자
#include <stdio.h>

int main(void)
{
	int i = 10;
	char c = 69;
	float f = 12.3;

	printf("i의 주소: %u\n", &i); // 변수 i의 주소 출력
	printf("c의 주소: %u\n", &c); // 변수 c의 주소 출력
	printf("f의 주소: %u\n", &f); // 변수 f의 주소 출력
	return 0;
}

 

포인터 변수

: 변수의 주소를 가지고 있는 변수

int *p; //포인터 변수의 선언

 

  • 포인터와 변수의 연결
char c = 'A';		// 문자형 변수 c
float f = 36.5;		// 실수형 변수 f
double d = 3.141592;	// 실수형 변수 d

char *pc = &c;		// 문자를 가리키는 포인터 pc
float *pf = &f;		// 실수를 가리키는 포인터 pf 
double *pd = &d;		// 실수를 가리키는 포인터 pd

 

Ex1
#include <stdio.h>

int main(void)
{
	int i = 10;
	double f = 12.3;
	int *pi = NULL;

	double *pf = NULL;
	pi = &i;
	pf = &f;

	printf("%u %p\n", pi, i);
	printf("%u %p\n", pf, f);
	return 0;
}

💡변환 명세 %u 는 부호없는 10진수를 출력하고
%p 는 포인터의 주소(16진수)를 출력한다.

(주소값의 경우 음의 정수값을 가질 수 있으므로 '%u'를 이용하여 이를 방지한다.)

 

포인터 연산

  • 증감 연산 시, 데이터 타입에 따른 메모리 값을 더하거나 뺀다.

 

Ex2. 포인터 변수의 증감 연산
#include <stdio.h>
int main(void) {
	char *pc; 
	int *pi;
	double *pd;

// 변수를 포인터형 변수로 선언했으므로
// 할당 정수 값 '10000'을 각 데이터 타입에 맞춰 타입 캐스팅 해줌
	pc = (char *)10000;
	pi = (int *)10000;			
	pd = (double *)10000;			
	printf("증가 전 pc = %d,  pi = %d,  pd = %d\n", pc, pi, pd);

	pc++;
	pi++;
	pd++;
	printf("증가 후 pc = %d,  pi = %d,  pd = %d\n", pc, pi, pd);
	printf("pc+2 = %d, pi+2 = %d, pd+2 = %d\n", pc+2, pi+2, pd+2);
	return 0;
}

 

💡 int  *int 은 서로 다른 자료형이다!

 

간접 참조 연산자(*)

: 포인터가 가리키는 값을 가져오는 연산자

int i=10;
int *p;
p =&i;
printf(“%d”, *p):
  • & 연산자: 변수의 주소를 반환
  • * 연산자: 포인터가 가리키는 곳의 내용 반환

 

Ex3
#include <stdio.h>

int main(void)
{
	int i = 3000;
	int *p=NULL;	

	p = &i;	
	
	printf("i = %d\n", i);	   // 변수의 값 출력
	printf("&i = %u\n\n", &i);  // 변수의 주소 출력

	printf("p = %u\n", p);	// 포인터의 값 출력
	printf("*p = %d\n", *p);	// 포인터를 통한 간접 참조 값 출력

	return 0;
}

 

Ex4
#include <stdio.h>
int main(void)
{
	int i=10;
	int *p;

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

	*p = 20;
	printf("i = %d\n", i);
	return 0;
}

 

Ex5. 간접 참조 연산자와 증감 연산자

#include <stdio.h>

int main(void)
{
	int i = 10;
	int *pi = &i;

	printf("i = %d,  pi = %p\n", i, pi);
	(*pi)++;	
	printf("i = %d,  pi = %p\n", i, pi);

	printf("i = %d,  pi = %p\n", i, pi);
	*pi++;	
	printf("i = %d,  pi = %p\n", i, pi);

	return 0;
}

 

포인터 사용시 주의점

  • 초기화 안된 포인터를 사용하면 안된다.
int main(void)
{ 
	int *p;
	*p = 100;
	return 0;
}

 메모리가 어디를 참조하는지 알 수 없어, 프로그램에 치명적인 결과를 발생시킬 수 있다.

 

💡 NULL 포인터로 간접 참조를 하게 되면 하드웨어로 감지한다.

- 포인터의 타입과 변수의 타입은 일치해야 한다.

#include <stdio.h>

int main(void)
{
	int i;
	double *pd;

	pd = &i;	// ERROR!
// double형 포인터에 int형 변수의 주소를 대입
	*pd = 36.5;	

	return 0;
}

 

 

 

 


 

 

 

 

아래 노션 페이지에 C 공부 내용에 대해 업로드 합니다!

수정사항이나 질문사항의 경우 노션 댓글로 남겨주세요!(*•̀ᴗ•́*)و ̑̑

 

 

 

C 언어 이론 정리

조건문, 반복문 사용 시 중괄호로 명령문들 묶어주기 - 명령문 1개일 때 포함 (코드 수정 시 오류 방지)

www.notion.so

 


 

개발 환경

Visual Studio 2019
Visual Studio Code

작성 플랫폼

Notion

 

728x90

'🧑‍💻 Language > C·C++' 카테고리의 다른 글

[C 이론] 13. 문자와 문자열(1)  (0) 2021.06.05
[C 이론] 12. 포인터(2)  (0) 2021.06.01
[C 이론] 10. 배열  (0) 2021.05.26
[C 이론] 9. 함수와 변수  (0) 2021.05.13
[C 이론] 8. 함수  (0) 2021.05.06