[완료] C에서 배열이름의 정체는 무엇인가요.

ystory의 이미지

안녕하세요. 기본적인 문법인데 잘이해가 안되서 이렇게 질문을 올립니다.

#include <stdio.h>
 
int main()
{
	int a[2] = {1, 2}
 
	printf("%d %d %d", a, &a[0], &a);
}

위의 결과를 보면 3가지 값 모두가 똑같습니다.

배열이름은 배열의 첫번째 인덱스의 주소값을 가지니 a == &a[0] 은 성립한다고 생각 합니다.

하지만 a 라는 값(즉 배열의 주소가 저장되는 공간) 자체도 어딘가 메모리 공간에 할당될테고 (주소값을 저

장하는 메모리공간 = 포인터) 다시 말해 &a 를 출력했을시 어딘가 다른 메모리 주소가 출력되야 하는데 그

렇질 않습니다.

게다가 sizeof 연산을 해보면 배열이름의 저장 공간은 포인터 크기가 아닌 배열 전체의 크기가 나오는데

이걸 어떻게 이해해야 합니까 -_-;;

배열이름은 배열의 크기 정보까지 저장하고 있는 포인터의 또다른 확장인가요?

이상 허접한 질문이었습니다. 그럼 수고하세요.

익명 사용자의 이미지

간단한 힌트를 주자면...
&a[0], &a에서 주소값은 서로 같지만, 자료형!! 이 다릅니다. ^^

ystory의 이미지

a[0]은 int 형 자료형을 가질테고, a는 어떤 자료형을 갖는 건가요.
포인터 처럼 크기가 4바이트도 아니고 배열의 크기를 가진 자료형인데,
그렇다면 제가 모르는 또다른 자료형이 존재 하는것인가요 -_-;;
읔,,,
--------------------------------------
http://www.ystory.kr
mail@ystory.kr
Kongju national Univ.
Information Technology

--------------------------------------
으휴

bartsesang의 이미지

몇 일 전에 책에서 본 내용 중에 일부네요. 요즘 자료구조 책 보고 있는데 기초가 너무 부족해서 'C 기초 플러스' 책을 봤는데, 위 내용이 포인터와 배열의 차이점입니다.(제가 틀릴 수도 있으니 믿진 마시고 확인해 보세요. - 책을 찾아보려 했는데 어딜 봤는지도 기억이 안나요.)

char *a;
char b[5];

이렇게 정의된 두 변수에서, a와 b는 자료가 저장된 메모리의 공간을 가리킵니다. 하지만 a는 변수이고 b는 상수로 정의 됩니다. 문자열을 가리킨다면 문자열의 첫 주소인 a를 기억하기 위한 공간을 따로 마련해 두고 저장하지만, b의 경우 그 공간 배정 없이 그냥 상수로 인식한다는 것이 배열과 포인터의 차이라고 읽었습니다.

a++은 가능하지만 b++은 상수이니 불가능하다는 것도 주의하라네요. ^^;

하나를 알면 열이 궁금해요.. 털썩... OTL

Darkcircle의 이미지

a : 형태는 그냥 변수입니다. 그런데 배열 = 포인터상수 이므로 주소값이 출력됩니다.
*a나 a[0]이 같은 값이 나오게 되는 이유는 ... 포인터니까요.

&a[0], &a : 사실 두놈은 내뱉는 결과가 똑같습니다. 표현자료형은 다르겠지만요.
실험해보시면 아실지도 모르겠지만 &a[1]과 &(*(a+1))의 결과...가 같게 나옵니다.
처음은 정적형태이고 그다음은 동적형태입니다. 문제는 &(a+1) 하면 에러납니다.

a와 &a는 다르죠... 변수로 보나 뭘로 보나...
&a[0]은 &(*a) 이지 a가 아닙니다. ( 왜 그런진 책을 찾아보세요 :) )
결과를 출력해보시면 &(*a) == &a 입니다.
& 대신 *로 하면 값이 출력되는데 &는 값이 저장된 위치를 가리키는 포인터 ...
그 포인터의 위치를 가리키는 "포인터의 주소 값"입니다.
그러니까 .. 에 .. 주소값을 저장하는 변수가 또 다른 어떤 메모리공간에 위치하고 있는지
(실제주소는 아님.)에 대한 정보를 가지고 있다는거죠.

그 위치를 바꾸려면 a를 포인터 형태로 취하고 포인터 연산을 하는 것입니다.
이게 배열 배우다 포인터 넘어가면 미쳐버리는거죠.

위의 설명을 토대로라면,
결과적으로 a == &a[0] 는 잘못된 등식이며, 두 놈의 차원이 다릅니다.
a가 3차원이라고 가정하면 &a[0]는 4차원(!!!!!) 이죠... (-_-);

포인터의 주소값은 이중포인터에 이중 포인터의 주소값은 삼중 포인터에 위치하게 됩니다.
이런식으로 하면 10000 중 포인터는 10001중 포인터에 주소값을 전달할 수 있겠죠...
(뭐 이런일은 없겠지마는.. 흐흠..)

==============================================
니네 군대에서 멀쩡한 몸으로 18시간 자봤어? ㅋㅋㅋ

---------------------------------------------------------------
폐인이 되자 (/ㅂ/)

cppig1995의 이미지

ANSI C에서는 배열명 a에 대해 &a가 a와 정확히 같은 것을 의미하는 것으로 알고 있습니다.
일부 컴파일러에서는 배열명 앞에 &를 붙여서 사용할 때 경고를 내주고, 초기의 구현에서는 아예 컴파일되지도 않았습니다.

그리고, a는 T * const a로 생각하시면 될 것 같습니다.

(추가) sizeof(a)를 해서 배열 전체의 크기가 나오는 것은 편리합니다. 선언한 후에 int형 배열이라면
sizeof(a) / sizeof(int)를 해서 요소(element) 개수를 알아낼 수 있기 때문이죠.
단, 다른 함수에 넘겨진 뒤에는 이런 혜택을 잃게 됩니다. void f(int a[2]) = void f(int a[]) = void f(int *a)기 때문이죠.



revision2008, formally known as cppig1995

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

김일영의 이미지

a는 식 내에서 &a[0]를 나타내고
&a는 a, 즉 &a[0], 다시말해서 배열의 첫번째 'element'에 대한 포인터와 동일한 의미가 아니라
a 배열 전체에 대한 포인터인 것으로 알고 있습니다.
형변환을 해 보시면 아실 듯.

ystory의 이미지

좋은 답변들 감사합니다.
이제야 조금 이해했네요...
감사합니다~~~~~ㅎ
--------------------------------------
http://www.ystory.kr
mail@ystory.kr
Kongju national Univ.
Information Technology

--------------------------------------
으휴

댓글 달기

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