이 포스팅은 한국기술교육대학교 김덕수 교수님의 '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
'TIL (Today I Learned) > C 기초 문법' 카테고리의 다른 글
[C 기초 문법] 포인터와 배열 (0) | 2022.12.26 |
---|---|
[C 기초 문법] 포인터 주의사항 (0) | 2022.12.25 |
[C 기초 문법] 포인터? (1) | 2022.12.25 |
댓글