c++ 다중 포인터에 대해 잘 아시는 분께 질문 드립니다.
글쓴이: gyxor / 작성시간: 금, 2003/06/06 - 2:30오후
#include<iostream.h> int main() { //(1) // 데이터형 변수 = 내용 double a1 = 10 ; double* a2 = &a1; double** a3 = &a2; double*** a4 = &a3; //(2) double** data[3][3] = {&a2,&a2,&a2} ; double** (*p1)[3] = data; double** (**p2)[3] = &p1; double** (***p3)[3] = &p2; double** (****p4)[3] = &p3; double** (*****p5)[3] = &p4; return 0; }
/*
포인터에 대한 개념들을 정리 하던중에 위 내용같이 엉뚱한 예문이
나오게 되었는데요..
제가 생각해도 좀 엽기적이지만..
다 공부를 위한것이니까 이해해 주시기 바랍니다.
변수자체와 데이터형을 구분짓기 위해 저렇게 예문을 짰습니다.
궁금한 것은요..
첫째,
(1)에서 데이타 형을 따지자면
a1 은 int 형 변수 이고
a2 는 int* 형 변수이고 ......
등등등이 되는거 같은데요..
a1~a4 자체는 int(엄밀히 말해서..)인데요..
예를 들어
double** a3 = &a2;
이것의 경우에 a3변수 자체는 int(사이즈) 데이터이고
포인터(*) 두개를 붙였을때 double 형이 되는 데이터라고 생각한다면
이것이 다중포인터의 개념인지...
이것이 맞는 생각인가요? (제가 제 생각이 맞는지 모르겠습니다.)
둘째,
(2)에서 예를들어
double** data[3][3] = {&a2,&a2,&a2} ;
이 배열은 원소를 각각 double** 타입의 데이터로 가지고 있는데요..
double** (***p3)[3] = &p2;
그렇다면 이 내용에서 p3는 어떻게 정의해야 할까요?
p3자체는 데이터 형이 무엇인가요?
int*** 타입이라고 해야 맞을까요?
*/
Forums:
Re: c++ 다중 포인터에 대해 잘 아시는 분께 질문 드립니다.
포인터는 포인터일 뿐입니다. 그냥 주소값을 저장할 수 있는 변수 그 자체로서 이해하면 되지 굳이 int라고 이해할 필요가 있을까요? 물론 포인터 값은 정수형(integral)으로 변환될 수 있긴 합니다만, 별로 좋은 방법의 이해 방식은 아닌 것 같습니다.
그냥 포인터의 정의를 이용하여 재귀적으로 이해하시면 되겠습니다. double*형은 'double형'의 주소값을 저장할 수 있는 포인터, double**형은 'double*'형의 주소값을 저장할 수 있는 포인터, double***형은 'double**'형의 주소값을 저장할 수 있는 포인터입니다.
이런 류의 복잡한 변수 선언문을 해석하는 방법에 대한 글을 소개합니다.
http://groups.google.com/groups?selm=39C8C596.97BDB484%40bawi.org
그냥 단순히 연산자의 우선순서대로 영어문장을 만들면 되겠습니다.
규칙대로 하자면...
double** data[3][3] = {&a2,&a2,&a2} ;
declare data as array3 of array3 of pointer to pointer to double
[([double형을 가리킬 수 있는 포인터]를 가리킬 수 있는 포인터)의 3 배열]의 3 배열
double** (*p1)[3] = data;
declare p1 as pointer to array 3 of pointer to pointer to double
[([double형을 가리킬 수 있는 포인터]를 가리킬 수 있는 포인터)의 3배열]의 포인터
배열의 이름은 첫번째 원소를 가리키는 주소값이 되므로 위의 선언문은 올바른 문장이 되겠죠.
double** (**p2)[3] = &p1;
declare p2 as pointer to pointer to array 3 of pointer to pointer to double
([([double형을 가리킬 수 있는 포인터]를 가리킬 수 있는 포인터)의 3배열]의 포인터)의 포인터
double** (***p3)[3] = &p2;
double** (****p4)[3] = &p3;
double** (*****p5)[3] = &p4;
나머지도 모두 같은 방식으로 해석 가능합니다.
포인터는 포인터 그 자체로 이해하십시오. 굳이 말하자면 '정수형(integral) 값으로 변환될 수 있다' 정도 되겠습니다.
댓글 달기