일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ChatGPT
- 잡잡 NBR 요가매트 스탠다드 운동매트 10mm 퍼플
- 삼성 갤럭시워치5
- 두칸 프릴 오버핏 후드티
- list #pop #remove #del #append #insert #list형 #파이썬 파이썬 기본 문법 #파이썬 list
- 굿아이템 양면오픈형 투명 접이식 리빙박스 폴딩박스 옷정리함 수납박스 펜트리수납함
- 23SS 스트라이프 오버핏 셔츠 723033 V2L30 9066
- ipTIME 유무선공유기
- 오토비 AZ100TR 32G 전후방 FHD 2채널 트럭 화물차 전용 블랙박스 보증기간 2년 20m케이블 포함 후방 적외선 방수 AS 2년보장
- 22FW 로고 패치 포켓 체크 셔츠 2F000 03 M2359 F41
- 위드리빙 대용량 옷 수납 방수 바구니
- 대림디움 대림바스플랜 PL-3070 탑카운터형 세면대/욕실/화장실/세면도기
- 8052 블랙라인 정사각 세면기
- 리빙앤트리 펠리컨 박스 대
- 22FW 이바나 빈티지 체크 셔츠 더스트핑크 8054631
- 긍정
- 반스 올드스쿨 VN000D3HY28
- 남쪽나무 세면대 세면대 세트 (스마트거울) 벽걸이세면대 이케아세면대 세면기
- 미네 리빙다이닝 6인 원목 코너형 식탁세트(소파형)
- [제이앤제나] 허리에 무리없는 신생아부터 역류방지쿠션_앨리펀블루 역류방지쿠션
- 1개
- 톰브라운 명품톰브라운 23SS 더블페이스 니트 아우터형 포켓 셔츠 MJT291A 07545 415
- 내셔널지오그래픽 피너스 빅로고 라운드넥 긴팔 티셔츠 카본 블랙
- 코멧 접이식 투명 리빙박스 56L 대형 2개입
- 러버메이드 벤티드 브루트(75L) 원형 컨테이너 리빙박스
- 더블탭스 22SS 정글 01 셔츠 WTAPS JUNGLE 01 GREIGE M
- 샤오미 미밴드 7 스마트밴드
- 봄봄 골드라인 4023G 탑볼세면대 화이트골드 카운타 도기볼 카페세면대
- 올리비아 스텐 세면대 세트
- 네스파 다야몬드은박 후드티
- Today
- Total
냥집사의 개발일지
C언어 - 이중 포인터 (Pointer to Pointer) 본문
안녕하세요 오늘은 이중 포인터에 대해 정리해보겠습니다.
1. 이중 포인터
포인터도 하나의 변수이므로 그 주소가 있습니다. 이중 포인터란 포인터를 가리키는 포인터라고 할 수 있습니다.
이중 포인터의 선언 방법 -> 가리키는 자료형 + 간접 참조 연산자 + 포인터 변수
ex) int** ppt, double** ppt
temp는 정수형 변수
ptemp는 정수형 변수 temp를 가리키는 포인터 변수
pptemp는 포인터 변수 ptemp을 가리키는 포인터 변수
#include <stdio.h>
int main(){
int temp = 5;
int* ptemp = &temp;
int** pptemp = &ptemp;
printf("*ptemp : %d\n",*ptemp);
printf("**pptemp : %d\n", **pptemp);
printf("\n");
printf("&temp : %u\n", &temp);
printf("ptemp : %u\n", ptemp);
printf("*pptemp : %u\n", *pptemp);
return 0;
}
아래 결과에서 알 수 있듯이 pptemp는 ptemp를 가리키고 ptemp는 temp를 가리킵니다.
**pptemp가 5를 출력하는 이유를 정리해봅시다.
**pptemp -> *(*pptemp) -> *(ptemp) -> temp
위처럼 **pptemp가 temp를 가리키게 되는 걸 알 수 있습니다.
2. 이중 포인터의 활용(1)
포인터 값을 바꾸는 함수의 매개변수 역할
아래 코드는 2개의 문자열을 서로 바꾸는 함수에 매개변수로 이중 포인터를 활용합니다.
p1은 hello를 가리키는 포인터 변수
p2는 world를 가리키는 포인터 변수
pp1은 hello를 가리키는 포인터 변수를 가리키는 이중 포인터 변수
pp2은 world를 가리키는 포인터 변수를 가리키는 이중 포인터 변수
(뭔가 말장난 같네요 ㅎ)
#include <stdio.h>
void swap_pointer(char** pp1, char** pp2){
char* ptemp;
ptemp = *pp1;
*pp1 = *pp2;
*pp2 = ptemp;
}
int main(){
char* p1 = "hello";
char* p2 = "world";
printf("before swap\n");
printf("p1 : %s , p2 : %s\n",p1,p2);
swap_pointer(&p1, &p2);
printf("after swap\n");
printf("p1 : %s , p2 : %s\n",p1,p2);
return 0;
}
pp1은 p1의 주소 값
*pp1은 p1
p1은 hello의 시작 주소 값
pp2는 p2의 주소 값
*pp2는 p2
p2는 world의 시작 주소 값
즉, p1(hello의 시작 주소 값)과 p2( world의 시작 주소 값)를를 swap 했으므로
아래 결과처럼 문자열이 바뀐 것을 확인할 수 있습니다.
3. 이중 포인터의 활용(2)
포인터 배열을 매개변수로 받는 함수에 매개변수 역할
2022.09.15 - [C언어] - C언어 - 포인터 배열(array of pointer)
(포인터 배열 관련 포스팅을 참고하시면 더욱 이해가 쉬워집니다)
포인터 배열을 출력하는 함수의 매개변수로 이중 포인터를 활용했습니다.
#include <stdio.h>
void print_array_of_pointer(char** pparr, int size){
for(int i=0; i<size; i++){
printf("%s\n",pparr[i]);
}
printf("\n");
for(int i=0; i<size; i++){
printf("%s\n",*(pparr + i));
}
}
int main(){
char* parr[] = {"hello","world","pointer"};
int size = sizeof(parr) / sizeof(parr[0]);
print_array_of_pointer(parr,size);
return 0;
}
코드 해설
1.size가 정해지는 원리
sizeof(parr) : 포인터 3개의 요소를 가진 배열의 크기 => 12byte
sizeof(parr[0]) : hello를 가리키는 포인터 변수의 크기 => 4byte
따라서 size는 3 => 포인터 배열의 요소가 3개임을 알 수 있습니다.
2. pparr이란?
pparr은 parr (&parr[0]) 즉, hello를 가리키는 포인터 변수의 주소 값입니다.
3. pparr 이중 포인터를 통해 parr 포인터 배열을 출력하는 방법
pparr를 배열 표현을 이용해 parr 포인터 배열을 출력합니다.
pparr를 포인터 표현을 이용해 parr 포인터 배열을 출력합니다.
오늘은 이중 포인터와 이중 포인터의 활용 방법에 대해 정리해보았습니다.
포인터 & 배열 언제나 헷갈리는 부분입니다. 이번 포스팅을 통해 조금이나마 도움이 되었으면 좋겠네요
좋은 하루 보내세요~
'C언어' 카테고리의 다른 글
C언어 - 함수 포인터 (Function Pointer) (0) | 2022.09.18 |
---|---|
C언어 - 배열 포인터 (pointer to an array) (0) | 2022.09.17 |
C언어 - 포인터 배열(array of pointer) (0) | 2022.09.15 |
C언어 - 다차원 배열(N dimensional array) (0) | 2022.09.14 |
C언어 - 데이터 공유 (call by value, call by reference) (0) | 2022.09.13 |