C 언어 - 다중 포인터

컴퓨터/C

728x90
반응형

다중 포인터

어느 정도 포인터의 개념이 익숙해졌다면, 다중 포인터에 대하여 알아보겠습니다.

다중 포인터란 포인터를 담는 포인터의 개념입니다.  포인터를 정확하게 이해하고 있으면 다중 포인터의 개념을 이해하는 데는 문제가 없을 것입니다.

 

다중 포인터의 선언과 사용 해기 보기

다중 포인터는 포인터 변수를 선언하는 *의 개수로 몇 중 포인터인지 선언을 합니다. 

예를 들어 2중 포인터의 선언은 다음과 같습니다.

	int val;  // 일반 변수
	int* p;   // 1중 포인터 변수
	int** pp; // 2중 포인터 변수

3가지 변수에 대하여 특징을 다시 한번 정리해 보자면 다음과 같습니다.

  • 일반 변수 val
    • 일반 변수는 할당된 메모리 주소 안의 데이터를 사용할 수 있습니다.
  • 1중 포인터 변수 p
    • 포인터 변수 p 안에 메모리 주소의 정보를 저장할 수 있습니다.
    • *을 통해 포인터 변수 p안에 저장된 메모리 주소안의 데이터를 사용할 수 있습니다.
  • 2중 포인터 변수 pp
    • 포인터 변수 pp안에 메모리 주소의 정보를 저장할 수 있습니다.
    • *을 통해 포인터 변수 pp안에 저장되어 있는 메모리 주소 안의 데이터를 사용할 수 있습니다.
    • 만약 pp안에 포인터 변수가 저장되어있다면
      • **을 통해 pp안에 저장된 p안에 저장되어있는 메모리 주소 안의 데이터를 변경할 수 있습니다.
      • *을 통해 pp안에 저장되어있는 p안에 저장되어있는 메모리 주소를 변경할 수 있습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	int val = 10;;  // 일반 변수

	int* p;   // 1중 포인터 변수
	int** pp; // 2중 포인터 변수

	p = &val;
	pp = &p;
	printf("*p로 val 접근: %d\n", *p);
	printf("**pp로 val 접근: %d\n", **pp);
	
	printf("pp에 저장된 메모리 주소 : %X\n", pp);
	printf("p의 메모리 주소 : %X\n", &p);
	printf("p에 저장된 메모리 주소 : %X\n", p);
	printf("val의 메모리 주소 : %X\n", &val);
}

다중 포인터의 장점

포인터와 다중포인터의 개념을 이해했다면 왜 쓰는지 알아야 됩니다.

포인터의 경우 여러 지역변수를 다른 함수에서 제어할 수 있는 장점이 있다고 했습니다.

그렇다면 다중 포인터는 어떤 장점이 있을까요?

어떤 지역 내에 선언된 포인터 변수를 다른 함수에서 제어할 수 있게 됩니다. 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>


void swap(int** pp)
{
	int a;
	int* p;
	p = &a;
	printf("함수 안의 a의 주소 : %p\n", &a);

	//2중 포인터로 main함수안의 p 포인터 안에 저장된 메모리 값 수정
	*pp = &a;

}

int main()
{
	int val = 10;;  // 일반 변수

	int* p;   // 1중 포인터 변수
	p = &val;
	printf("val의 메모리 주소: %p\n", &val);
	printf("함수 실행 전 p안에 저장된 메모리 주소 : %p\n", p);
	swap(&p);
	printf("함수 실행 후 p안에 저장된 메모리 주소 : %p\n", p);

}

 

 

이해가 되셨나요? 2중 포인터를 함수의 매개변수로 사용한다면 다른 함수에 있는 포인터 변수에 저장된 메모리 주소를 제어를 할 수 있는 장점이 생깁니다. 이런 기능들을 이용해 함수와 함수 사이에서 조금 더 데이터를 원활하게 관리할 수 있습니다.

 

 

 

 

728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - static 키워드 (정적 키워드)  (0) 2021.06.26
C 언어 - Stack Frame (스택 프레임)  (0) 2021.06.26
C 언어 - 구조체 포인터  (0) 2021.06.23
C 언어 - typedef 키워드  (0) 2021.06.22
C 언어 - struct(구조체)  (0) 2021.06.22

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :