Except when it is the operand of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression that has type "array of type" is converted to an expression with type "pointer to type" that points to the initial element of the array object and is not an lvalue.
배열 타입을 갖는 수식은 자동 변환되어, 그 배열의 첫번째 원소를 가리키는 포인터 주소값을 반환한다. 이 결과값은 lvalue가 아니다. 여기에는 아래의 3가지 예외상황이 존재한다.
- 예외1 : sizeof 연산자의 피연산자로 쓰인 경우. 예) sizeof(arr)
- 예외1 : & 연산자의 피연산자로 쓰인 경우. 예) &arr
- 예외3 : char형 배열의 초기화에 쓰이는 문자열 상수인 경우. 예) char str[] = "hello";
- 해설 : 문자열 상수(string literal)도 배열이므로, 해당 규칙의 적용을 받아 배열처럼 사용이 가능하다. "abcdefg"[3] 라던가3["abcdefg"] 라던가... char *str = "hello"; 의 경우에도 "hello"의 첫번째 원소를 가리키는 주소값이 대입된다. 그러나 char str[] = "hello"; 와 같이 문자형 배열을 초기화할 때에는 이 예외3이 적용되어 위에서 설명한 변환 규칙이 적용되지 않는다.
- (나무위키 펌)
[C89] § 6.5.4.2
[CT&P] § 3.3 pp. 33-4, § 4.5 pp. 64-5
6.4를 참고하기 바랍니다.) 비록 서로 연관되어 있기는 하지만 (질문
6.3 참고), 또 비슷하게 쓰이기도 하지만 (질문
4.1,
6.8,
6.10,
6.14 참고), 배열은 포인터가 아닙니다.char a[6]과 같은 선언은 문자 여섯 개를 저장할 수 있는 공간을 요청하고, 그 결과 ``a''라는 이름이 이 공간을 대표하게 됩니다. 반면 포인터 선언 char *p는 포인터를 저장할 수 있는 공간을 요구하고 이 위치는 ``p''라고 이름지어집니다. 이 포인터는 이제 어떤 곳도 가리킬 수 있습니다: 정확히 말해 어떤 문자나, 문자로 이루어진 배열의 한 요소를 가리킬 수도 있으며, 아무것도 가리키지 않을 수도6.1 있습니다 (질문 ![[*]](/media?src=http://www.cinsk.org/cfaqs/html/crossref.png&board=programming&pid=517660)
![[*]](/media?src=http://www.cinsk.org/cfaqs/html/crossref.png&board=programming&pid=517660)
그림으로 보는 것이 훨씬 더 나을 것입니다. 다음 두 선언은:
char a[] = "hello"; char *p = "world"; 다음과 같이 데이터를 초기화합니다:x[3]과 같은 reference가 x가 배열이냐 포인터이냐에 따라 서로 다른 코드를 생성한다는 것을 알아야 합니다. 위에 선언한 코드를 예로 들면, 컴파일러는 a[3]을 봤을 때, 주소 `a'에서 세 개만큼 지나서 그 위치의 문자를 가져옵니다. 그리고 컴파일러가 p[3]과 같은 코드를 봤을 때, 주소 `p'에 셋을 더한 다음, 그 위치의 문자를 가져옵니다. 다시 말하면, a[3]은 `a'라고 이름붙은(named) 곳에서 3만큼 지난 곳을 의미하며, p[3]은 `p'가 가리키는(pointed) 곳에서 3만큼 지난 곳을 의미합니다. 위의 예에서는 a[3]이나 p[3]이 모두 문자 `l'을 가지고 있지만, 컴파일러는 이 곳을 찾기 위해서 다른 코드를 사용합니다. (가장 큰 차이는 `a'와 같은 배열과 `p'와 같은 포인터의 값을 계산할 때 컴파일러가 서로 다른 방법을 써서 계산한다는 것입니다. 이 계산은 subscript 연산자 []를 쓰는지의 여부와 관계없습니다. 다음 질문을 참고하기 바랍니다.)
References[K&R2] § 5.5 p. 104[CT&P] § 4.5 pp. 64-5
Q 6.10아직도 잘 모르겠습니다. 포인터가 배열의 일종인가요, 아니면 배열이 어떤 포인터의 한 종류인가요?Answer배열은 포인터가 아니며, 포인터도 배열이 아닙니다. 배열 reference(즉, 값이 쓰이는 곳에 배열을 쓰는 것)는 포인터로 변경됩니다 (질문
6.2,
6.3 참고).- Pointers can simulate arrays (though that's not all; see question
4.1)
- There's hardly such a thing as an array (it is, after all, a ``second-class citizen''); the subscripting operator [] is in fact a pointer operator.
- At a higher level of abstraction, a pointer to a block of memory is effectively the same as an array (although this says nothing about other uses of pointers).
But to reiterate, here are two ways not to think about it:
- ``They're completely the same.'' (False; see question
6.2.)
- ``Arrays are constant pointers.'' (False; see question
6.9.)
출처 : http://www.cinsk.org/cfaqs/html/node8.html#6.9
매우 재미 있군요 하
이미 C언어 시험은 쳤건만...

댓글 0