티스토리 뷰
포인터 배열
#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 |
댓글