줘이리의 인생적기

C - 포인터 본문

공부/C

C - 포인터

줘이리 2020. 5. 14. 20:07
728x90

 

Index

  • 메모리 주소
  • &(앰퍼샌드)
  • 포인터, 간접 참조 연산자
  • 주소와 포인터의 이해(차이, 크기, 사용하는 이유)

 

1. 메모리 주소

프로그램이 사용하는 메모리의 위치를 주소 값으로 식별할 수 있다.

바이트 단위로 구분되어 진다.

int형 변수 a가 메모리 1000번지부터 할당되었다면 1000부터 1003까지 4바이트로 할당된다.

 

2. &(앰퍼샌드)

변수가 메모리 어디에 할당되었는지 궁금할 때 주소 연산자(&)를 사용한다.

 

주소 알아보기 예제

#include <stdio.h>

int main(void)
{
	int a;             
	double b;         
	char c;           

	printf("int형 변수의 주소 : %u\n", &a);     //%u나 %x로 알아볼 수 있다.
	printf("double형 변수의 주소 : %u\n", &b);
	printf("char형 변수의 주소 : %u\n", &c);

	return 0;
}

실행결과

int형은 6487580부터 4바이트 할당

double형은 6487568부터 8바이트 할당

char형은 6487567부터 1바이트 할당

 

 

3. 포인터, 간접 참조 연산자(*)

한 번 구한 주소는 저장해서 사용하는게 편리하다.

변수의 메모리 주소를 저장해주는 변수가 바로 포인터.

(가리키는 변수의 형태가 같을때만 대입해야 한다, 강제 형 변환은 언제나 가능)

 

포인터 예제

#include <stdio.h>

int main(void)
{
	int a;       
	int* pa = &a;       // 포인터 선언, a의 주소 대입
	*pa = 1;      

	printf("포인터 a 값 출력 : % d\n", *pa);
	printf("변수로 a 값 출력 : % d\n", a);  

	return 0;
}

실행결과

즉, 포인터 pa가 할당된 영역에 변수 a가 할당된 영역의 메모리 처음 주소를 저장.

 

 

4. 주소와 포인터의 이해(차이, 크기, 사용하는 이유)

주소와 포인터의 차이 : 주소는 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체.

                              포인터는 그 값을 저장하는 또 다른 메모리 공간.

 

주소와 포인터의 크기 : 모든 주소와 포인터는 가리키는 자료형과 관계없이 크기가 같다.

 

포인터를 사용하는 이유 : 예제를 통해 알아보자.

#include <stdio.h>

void swap(int* pa, int* pb);   // 함수의 선언 

int main(void)
{
	int a = 10, b = 20;       

	swap(&a, &b);              // a, b의 주소를 인수로 주고 함수 호출
	printf("a: %d, b : %d\n", a, b);   

	return 0;
}

void swap(int* pa, int* pb)    
{
	int temp;                 

	temp = *pa;               
	*pa = *pb;                
	*pb = temp;               
}

실행결과

보는 바와 같이 a와 b의 값이 바뀌었다.

이 예제는 포인터를 사용하지 않고 구현할 수 있지만 그럴땐 사용 범위가 함수 내부로 제한된다.

포인터를 이용하면 두 변수의 값을 바꾸고 싶을 때 언제든지 함수를 호출하면 된다.

 

 

지적 및 개선사항은 언제든지 댓글로 부탁드립니다!

'공부 > C' 카테고리의 다른 글

C - 문자열(1)  (0) 2020.05.18
C - 문자  (0) 2020.05.18
C - 배열  (0) 2020.05.14
C - 함수  (0) 2020.05.12
C - 반복문(while, for, do ~ while)  (0) 2020.05.12