c++ 다중 포인터에 대해 잘 아시는 분께 질문 드립니다.

gyxor의 이미지

#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*** 타입이라고 해야 맞을까요?
*/

lsj0713의 이미지

gyxor wrote:

궁금한 것은요..
첫째,
(1)에서 데이타 형을 따지자면
a1 은 int 형 변수 이고
a2 는 int* 형 변수이고 ......
등등등이 되는거 같은데요..
a1~a4 자체는 int(엄밀히 말해서..)인데요..

포인터는 포인터일 뿐입니다. 그냥 주소값을 저장할 수 있는 변수 그 자체로서 이해하면 되지 굳이 int라고 이해할 필요가 있을까요? 물론 포인터 값은 정수형(integral)으로 변환될 수 있긴 합니다만, 별로 좋은 방법의 이해 방식은 아닌 것 같습니다.

gyxor wrote:

예를 들어
double** a3 = &a2;
이것의 경우에 a3변수 자체는 int(사이즈) 데이터이고
포인터(*) 두개를 붙였을때 double 형이 되는 데이터라고 생각한다면
이것이 다중포인터의 개념인지...
이것이 맞는 생각인가요? (제가 제 생각이 맞는지 모르겠습니다.)

그냥 포인터의 정의를 이용하여 재귀적으로 이해하시면 되겠습니다. double*형은 'double형'의 주소값을 저장할 수 있는 포인터, double**형은 'double*'형의 주소값을 저장할 수 있는 포인터, double***형은 'double**'형의 주소값을 저장할 수 있는 포인터입니다.

gyxor wrote:

둘째,
(2)에서 예를들어

double** data[3][3] = {&a2,&a2,&a2} ;
이 배열은 원소를 각각 double** 타입의 데이터로 가지고 있는데요..

double** (***p3)[3] = &p2;

그렇다면 이 내용에서 p3는 어떻게 정의해야 할까요?

이런 류의 복잡한 변수 선언문을 해석하는 방법에 대한 글을 소개합니다.

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;

나머지도 모두 같은 방식으로 해석 가능합니다.

gyxor wrote:

p3자체는 데이터 형이 무엇인가요?
int*** 타입이라고 해야 맞을까요?
*/

포인터는 포인터 그 자체로 이해하십시오. 굳이 말하자면 '정수형(integral) 값으로 변환될 수 있다' 정도 되겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.