티스토리 뷰

Programing/C++

C++ 다중, 더블 포인터

live2skull 2016. 7. 29. 15:38
포인터 배열
#include "stdafx.h"
#include "malloc.h"

int main(int argc, char *argv[], char* envp)
{
	char *test = "123456"; // "123456" 의 주소값
	char *test1 = "987654"; // "987654" 의 주소값
	char c = '1'; // '1' 문자
	
	char *ptr_array[] = {"123", "456"}; // 문자열을 배열로 가져올 수 있다.
	char *ptr_array2[] = {test, test1, &c, (char *)malloc(100)};
	
	printf("%s\n", *ptr_array); // 123 
	printf("%s\n", *(ptr_array + 1)); // 456
	printf("%s\n", ptr_array[1]); // 456
}
포인터 배열 : 포인터 값을 담는 배열. 

** 설명 그림이랑 코드랑 다름. 그림으로 정리.

첫번째 printf:
그냥 ptr_array 하게 되면 문자열이 제대로 출력되지 않음.
%s Format string을 주게 되면 printf는 인자값을 싱글 포인터로 취급하게 된다.
ptr_array를 넣었을 시 문자열의 포인터 주소들이 인자로 넘어가고, 당연히 깨진 문자열이 출력되게 됨.

두번째 printf:
ptr_array + 1 하게 ptr_array의 두번째 포인터값(배열idx+1)이 저장되어 있는 메모리 주소임. 이 메모리 주소에 저장되어 있는 값을 *로 불러내어 문자열이 있는 포인터 값을 가져온다.

세번째 printf:
ptr_array[idx]로 배열 꺽쇠를 이용하게 되면 해당 주소의 값(자동으로 포인터를 사용하는 것처럼) 가져오게 된다.


더블 포인터
#include "stdafx.h"
#include "malloc.h"

void allocate(int** p)
{
	*p = (int*)malloc(sizeof(int));
}

int main(int argc, char *argv[], char* envp)
{
	int* p = NULL;
	allocate(&p);
	*p = 42;
	
	printf("%d\n", *p); 
	free(p);
/*
	p에는 42의 값을 가지고 있는 4바이트 데이터의 Heap메모리 주소를 가지고 있다. (포인터)
	1. p
	push [ebp-4h]
	push offset "%d\n"
	call _printfs
		
	2. *p
	mov eax, [ebp-4h]
	push [eax] // ??
	push offset "%d\n"
	call _printf
*/
}

대표적으로 Call by reference 에서 사용되는 더블포인터 예제이다.

코드 예제에서는 인자로 전달되는 값이 포인터이므로 더블포인터를 인자값으로 받게 된다.


allocate(&p) 를 통해 p의 메모리 주소를 allocate로 넘기고, p에 저장된 값(포인터)에 새로운 heap 메모리를 할당하고, 그 주소를 넣어준다.

이때 p는 이 allocate에서는 p(본래 메모리 주소) -> (저장된 값 - heap memory pointer) -> real value이고,

p*로 저장된 값(call by reference)로 액세스 할 수 있고,

p**로 할당된 힙 데이터를 읽고 쓸 수 있다.


'Programing > C++' 카테고리의 다른 글

C++ Assert를 이용한 프로그램 디버깅  (0) 2016.08.02
C++ 함수 오버로딩, 오버라이딩  (0) 2016.08.01
C++ 구조체, 구조체 포인터  (0) 2016.07.31
C++ 메모리 할당, 포인터 (문자열)  (0) 2016.07.28
C++ 데이터 형  (0) 2016.07.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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 31
글 보관함