본문 바로가기
TIL (Today I Learned)/C 기초 문법

[C 기초 문법] 이중 포인터

by 둥굴프 2022. 12. 26.
이 포스팅은 한국기술교육대학교 김덕수 교수님의 'C언어 Lv2' 강의를 바탕으로 작성됐습니다.

 

두 배열을 교환 (Swap) 하려면?

방법 1 : 각 원소에 대해 swap 연산 수행 👉 비효율적

방법 2 : 이름만 바꿔줄 수는 없을까? 🤔

 

#1 이중 포인터

포인터는 변수

모든 변수(포인터)는 그 변수를 가리키는 포인터를 가질 수 있다.

즉, 포인터를 가리키는 포인터를 생성할 수 있다.

 

int a = 10;
int* p = &a;
int** dP = &p;

a = 10

*p = 10

**dP = 10 (이중 참조)

 

 이전에 원본값을 바꾸기 위해서 주소값을 함수의 인자로 사용했다.
이처럼 포인터를 바꾸기 위해서 포인터의 주소값을 함수의 인자로 사용하고, 이를 이중 포인터가 매개변수로 사용된다.

 

 

방법 2 : 포인터를 사용하여 배열 참조 & 참조 주소 Swap

이중 포인터를 사용한 swap 함수 작성 가능

크기가 큰 데이터를 다룰 때 사용 가능하다.

 

다차원 배열과 다중 포인터

2차원 배열의 이름은 이중 포인터

int a[3][5] = { ... }
printf("%d\n",*a);	// 6027664
printf("%d\n",**a); // 11

👉즉, 이차원 배열을 swap 하고자 한다면, swap함수는 삼중 포인터를 매개 인자로 선언해야 한다.

 

 

다중 포인터 활용 예제 - 장수 카드 바꾸기

#include <stdio.h>

void printCardInfo(void** _card) {
	printf("[%s]\n", _card[0]);
	printf("|통솔|무력|지력|정치|매력|\n");
	for (int i = 0; i < 5; i++)
		printf("| %d ", *((int*)_card[1] + i));
	printf("|\n");
}

void swapCard(void*** _A, void*** _B) {
	void** temp = *_A;
	*_A = *_B;
	*_B = temp;
}

void main(void) {
	char nameA[4] = { 'K', 'D', 'S', '\0' }, nameB[4] = {'H', 'P', 'C', '\0' };
	int infoA[5] = { 80, 40, 70, 90, 95 }, infoB[5] = {78, 86, 99, 57, 88};

	void* KDS[2] = { nameA, infoA };
	void* HPC[2] = { nameB, infoB };

	void** myCard = KDS;
	void** comCard = HPC;
	
	printf("my card = "); printCardInfo(myCard);
	printf("com's card = "); printCardInfo(comCard);

	printf("***** Card trading *****\n");
	swapCard(&myCard, &comCard);

	printf("my card = "); printCardInfo(myCard);
	printf("com's card = "); printCardInfo(comCard);
}

 

 

#2 문자열 배열

문자열들의 배열을 만들어, 여러 개의 문자열을 다룰 수 있다.

문자열 배열 = 2차원 char 배열

 

 

main 함수에 인자 전달하기

main 함수도 인자를 받을 수 있다.

int main(int argc, char* argv[]) { ... }

일련의 문자열을 입력받는다.

- argc : 입력 받은 문자열의 수

실행 파일명도 개수에 포함됨 ( 인자가 없는 경우 argc = 1 )

- argv : 입력 받은 문자를 참조하기 위한 문자열 포인터의 배열

실행 파일명이 argv[0]에 들어감

 

프로그램 실행 시, 실행 파일명 뒤에 입력할 문자열들을 함께 입력한다.

예) program.exe 10 C-Programming

 

댓글