[완료] C에서 배열이름의 정체는 무엇인가요.
글쓴이: ystory / 작성시간: 수, 2007/12/26 - 11:00오후
안녕하세요. 기본적인 문법인데 잘이해가 안되서 이렇게 질문을 올립니다.
#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 연산을 해보면 배열이름의 저장 공간은 포인터 크기가 아닌 배열 전체의 크기가 나오는데
이걸 어떻게 이해해야 합니까 -_-;;
배열이름은 배열의 크기 정보까지 저장하고 있는 포인터의 또다른 확장인가요?
이상 허접한 질문이었습니다. 그럼 수고하세요.
Forums:
간단한 힌트를
간단한 힌트를 주자면...
&a[0], &a에서 주소값은 서로 같지만, 자료형!! 이 다릅니다. ^^
a[0]은 int 형 자료형을
a[0]은 int 형 자료형을 가질테고, a는 어떤 자료형을 갖는 건가요.
포인터 처럼 크기가 4바이트도 아니고 배열의 크기를 가진 자료형인데,
그렇다면 제가 모르는 또다른 자료형이 존재 하는것인가요 -_-;;
읔,,,
--------------------------------------
http://www.ystory.kr
mail@ystory.kr
Kongju national Univ.
Information Technology
--------------------------------------
으휴
저도 허접하지만...
몇 일 전에 책에서 본 내용 중에 일부네요. 요즘 자료구조 책 보고 있는데 기초가 너무 부족해서 'C 기초 플러스' 책을 봤는데, 위 내용이 포인터와 배열의 차이점입니다.(제가 틀릴 수도 있으니 믿진 마시고 확인해 보세요. - 책을 찾아보려 했는데 어딜 봤는지도 기억이 안나요.)
char *a;
char b[5];
이렇게 정의된 두 변수에서, a와 b는 자료가 저장된 메모리의 공간을 가리킵니다. 하지만 a는 변수이고 b는 상수로 정의 됩니다. 문자열을 가리킨다면 문자열의 첫 주소인 a를 기억하기 위한 공간을 따로 마련해 두고 저장하지만, b의 경우 그 공간 배정 없이 그냥 상수로 인식한다는 것이 배열과 포인터의 차이라고 읽었습니다.
a++은 가능하지만 b++은 상수이니 불가능하다는 것도 주의하라네요. ^^;
하나를 알면 열이 궁금해요.. 털썩... OTL
배열은 포인터 상수...?!
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시간 자봤어? ㅋㅋㅋ
---------------------------------------------------------------
폐인이 되자 (/ㅂ/)
ANSI C에서는 배열명
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 배열 전체에 대한 포인터인 것으로 알고 있습니다.
형변환을 해 보시면 아실 듯.
좋은 답변들
좋은 답변들 감사합니다.
이제야 조금 이해했네요...
감사합니다~~~~~ㅎ
--------------------------------------
http://www.ystory.kr
mail@ystory.kr
Kongju national Univ.
Information Technology
--------------------------------------
으휴
댓글 달기