2014-04-17 2 views
3

s++const char 배열 이름이 함수의 const 값입니까? 이 함수에있을 때

void f(char s[]) { 
    s++; // Why it works here? 
} 

유효한이다하지만 주요 기능에있을 때 그것을하지 않습니다. 그것은 정확히 똑같은 데이터 유형을 가지고 있기 때문에 나에게 유선이다.

void main() { 
    char s[] = "abc"; 
    s++; // wrong because it is a const value. 
} 

왜 그렇습니까?

+0

'의 char * s의 [] = "ABC";'잘못되었습니다 - 당신은'숯불 *'의 배열에 문자열 (char''의 배열을) assinging하고 있습니다. – Frxstrem

+0

죄송합니다. 오타가 수정되었습니다. – canoe

+0

[설명] (http://stackoverflow.com/questions/22677415/why-do-c-and-c-compilers-allow-array-lengths-in-function-signatures-when-they/22677793#22677793) –

답변

7

이는 함수 매개 변수 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++; 
} 
+0

+1. 좋은 설명. 하나의 쿼리'void f (char s []); // 과 동등 함 void f (char * s);는 완전히 동일합니까? 그렇다면'[]'을 사용하는 이유는 무엇입니까? –

+1

@pranitkothari 그것은 단지 가독성을위한 것입니다. 컴파일러 *는 두 프로토 타입을 동일하게 간주합니다. – ajay

+1

가독성이 부족하다는 이유로 말할 수 있습니다.> –

관련 문제