포인터 관련질문입니다.

익명 사용자의 이미지

int z[3][2][2];

printf("%p\n" , z[0]); 와
printf("%p\n" , &z[0]);
또는
printf("%p\n" , z[2][1]); 와
printf("%p\n" , &z[2][1]);

주소값찍어볼때 각각 합법적으로 동일한 행위라고 생각되는데
맞는것인지요? 물론 실행하면 각각 똑같이 나옵니다.

익명 사용자의 이미지

#include

main()
{
char z[3][2][2];

printf("%p\n", z[2]);
printf("%p\n", &z[2]);

printf("%p\n", z[2][0]);
printf("%p\n", &z[2][0]);

printf("%p\n", z[2][1]);
printf("%p\n", &z[2][1]);

printf("%p\n", *(z + 2));
printf("%p\n", &*(z + 2));
printf("%p\n", (z + 2));

printf("%p\n", *(*(z + 2) + 0));
printf("%p\n", &*(*(z + 2) + 0));
printf("%p\n", (*(z + 2) + 0));

printf("%p\n", *(*(z + 2) + 1));
printf("%p\n", &*(*(z + 2) + 1));
printf("%p\n", (*(z + 2) + 1));
}

이거 실행해 보시고...

char -> int -> double로 바꿔보십시요.

왜 그런 결과가 생기는지 한번 생각해 보시면 도움이 되실 듯...

익명 사용자의 이미지

예, 동일한 것입니다.

char a[n][m][l] 로 선언된 배열의 경우에는
a자체가 주소가 되는데, &a도 a와 동일한 값을
갖습니다.

비슷한 예로 function pointer가 있는데,
function pointer에 function을 대입할 때
&를 붙여도 되고 안 붙여도 되며
function pointer를 통해 function을 call할 때
*를 붙여도 되고 안 붙여도 됩니다.

익명 사용자의 이미지

>int z[3][2][2];
>printf("%p\n" , z[0]); 와
>printf("%p\n" , &z[0]);
>또는
>printf("%p\n" , z[2][1]); 와
>printf("%p\n" , &z[2][1]);
>가 주소값찍어볼때 각각 합법적으로 동일한 행위라고 생각되는데
> 맞는것인지요? 물론 실행하면 각각 똑같이 나옵니다.

포인터란 pointer to T를 말하며, 여기서 T란 임의의 object을 가리킵니
다.

OP께서 질문하신것처럼, 물론 z 와 z[0], &z[0], z[0][0], &z[0][0]은 결
과적으로
모두 동일한 주소번지를 가리킵니다.하지만 중요한 차이점이 있습니다.
포인터의 정의인 pointer to T에서 T에 주목해야 합니다.
결과적으로 모두 동일한 주소번지를 가리킬지라도
모두 동일한 object를 가리키는 것은 아니라는 것입니다.

이러한 사실은 sizeof 연산자를 통해 쉽게 확인할 수 있 습니다.

sizeof(z), sizeof(&z), sizeof(z[0]), sizeof(&z[0]), sizeof(z[0]
[0]),
sizeof(&z[0][0])를 출력해보세요.

sizeof 연산자는 해당 pointer들이 가리키고 있는 object의 크기를 반환
해줍니다.

동일한 값이 출력되면, 동일한 object를 가리키는 것이지만,
다른 값을 출력하면, 다른 object를 가리킨다는 의미입니다.

익명 사용자의 이미지

>char a[n][m][l] 로 선언된 배열의 경우에는
>a자체가 주소가 되는데, &a도 a와 동일한 값을
>갖습니다.

그렇지 않습니다.
배열의 이름은 sizeof와 & 연산자의 피연산자로 사용되는 경우엔 배열의
첫번째 요소를
가리키는 포인터로 변환되지 않습니다.

또한 &a 와 a는 동일한 번지주소를 나타내지만, 동일한 object를 가리키
지는 않습니다.

>비슷한 예로 function pointer가 있는데,
>function pointer에 function을 대입할 때
>&를 붙여도 되고 안 붙여도 되며
>function pointer를 통해 function을 call할 때
>*를 붙여도 되고 안 붙여도 됩니다.

그렇지 않습니다.
함수 포인터에 function을 할당할때에는 함수의 이름이 함수의 포인터로
자동 변환되어 할당되지만, 함수이름에 & 연산자를 붙여서 할당할때에는
강제변환에 의해 함수의 포인터가 할당되어지는 것입니다.
또한 함수 이름은 sizeof와 &연산자의 피연산자로 사용되지 않는 경우에
만,
함수 포인터로 변환됩니다.
하지만 함수 이름이 sizeof 연산자의 피연산자로 사용된다면, 이 값은
invalid입니다.

extern int f();
int (*fp) ();
int i;

fp = f; /* OK, f is converted to &f */
fp = &f; /* OK, implicit conversion suppressed */

i = sizeof(fp); /* OK, result is the size of the pointer */
i = sizeof(f); /* Invalid */

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.