이는 함수 매개 변수 s
이 문자 배열이 아니고 문자에 대한 포인터이기 때문입니다. 함수에 배열을 전달할 수 없습니다. 실제로 전달 된 것은 배열의 첫 번째 요소에 대한 포인터입니다. 이 의미에서 배열은 C
의 최상위 객체가 아닙니다. 따라서, 아래의 두 함수 프로토 타입은 동일 -
가
void f(char s[]);
// equivalent to
void f(char *s);
이 s
모든 문자의 주소를 포함 할 수 있다는 것을 의미한다.
void f(char s[]) {
// s is a pointer to a character.
// s++ is fine. evaluates to s and
// makes s point to the next element
// in the buffer s points to.
s++;
return *s;
}
그러나, 다음 문은 배열로 s
을 정의하고 문자열 리터럴로 초기화합니다.
char s[] = "abc";
배열과 포인터는 다른 유형입니다. 배열 s
은 스택에 할당 된 메모리 위치에 바인딩됩니다. 다른 메모리 위치로 리바운드 될 수 없습니다. 변수의 값을 변경하는 것과 변수의 이름이 바인딩되는 메모리 위치를 변경하는 것의 차이점에 유의하십시오. 위의 함수에서 s
의 내용 만 변경하지만 s
자체는 항상 스택에 할당 된 고정 메모리 위치를 참조합니다.
s++; // in main
main
함수 위 문 &s[0]
에 배열 s
, 즉의 기본 주소를 평가하고 그 부작용 s
의 내용을 변경하는 것이다. s
의 내용을 변경하면 변수 s
을 항상 다른 오류의 메모리 위치에 바인딩하는 것을 의미합니다. 모든 변수는 수명 기간 동안 항상 동일한 메모리 위치를 나타냅니다. 그러나 내용은 변경 될 수 있지만 그 차이는 다릅니다.
int main(void) {
// s is an array. Arrays and pointers are
// different types. initialize s with the
// characters in the literal "abc"
char s[] = "abc";
// equivalent to
// char s[] = {'a', 'b', 'c', '\0'};
// illegal operation because s is an array.
// s is bound to a fixed memory location and
// cannot be changed.
s++;
}
'의 char * s의 [] = "ABC";'잘못되었습니다 - 당신은'숯불 *'의 배열에 문자열 (char''의 배열을) assinging하고 있습니다. – Frxstrem
죄송합니다. 오타가 수정되었습니다. – canoe
[설명] (http://stackoverflow.com/questions/22677415/why-do-c-and-c-compilers-allow-array-lengths-in-function-signatures-when-they/22677793#22677793) –