2009-11-24 6 views
25

당신이 C를 작성하는 경우 ++ 기능 * 별표, 그리고 컴파일러와 동등하다고 가정 할 때, 누구에게도 preferrable에 대한 스타일 가이드가 있습니까? 완성도를 들어[대괄호]의 차이와 * 별표

, 예를 들어

void readEmStar(int *arrayOfInt, int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 


void readEmSquare(int arrayOfInt[], int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 

int main() 
{ 
    int r[] = { 2, 5, 8, 0, 22, 5 } ; 

    readEmStar(r, 6) ; 
    readEmSquare(r, 6) ; 
} 

답변

56

당신이 초기화없이 char x[] 대신 char *x의 유형을 사용, 당신은 그들에게 동일을 고려할 수 있습니다. 새 유형은 초기화없이 char x[]으로 선언 할 수 없지만 함수의 매개 변수로 사용할 수 있습니다. 어떤 경우에는 포인터와 동일합니다.

당신이 유형 char x[] 대신 초기화char *x의를 사용

, 그들은 완전히 100 % 다릅니다. char x[]char *x 상이한 방법


예 :

char sz[] = "hello"; 
char *p = "hello"; 

sz 실제로 배열되지 포인터이다.

void test1(char *p) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

void test2(char p[]) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

함수에 전달하는 코딩 스타일 :

정말 미상 char x[]이 같은 char *x 같은 방법의


assert(sizeof(sz) == 6); 
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*)); 
니가하는 일은 중요하지 않아. 어떤 사람들은 char x[]을 선호하는데, 그 이유는 하나의 요소의 주소가 아니라 배열이 전달되기를 원하는 것이 분명하기 때문입니다.

일반적으로 배열 길이에 다른 매개 변수가 있기 때문에 이미 분명합니다.


추가 읽기 :

차이 떨어져 분명히 다른 스타일에서, 당신의 두 코드 사이가 없다 Arrays are not the same as pointers!

+0

배열과 포인터가 C++에서 매우 비슷하기 때문에 readEmSquare에서 – tloach

+0

의 차이점을 확인하고 sizeof (arrayOfInt)가 4를 반환하고 포인터가 – bobobobo

+0

인 점을 확인하십시오 (스택 대 힙 등). 초기화없이 char []를 사용할 때 내 노트를보십시오. –

3

자격이 게시물을 참조하시기 바랍니다. 두 경우 모두 함수 매개 변수 type *xtype x[]은 의미 상으로 동일하기 때문에 배열은 값이 아닌 참조로 전달됩니다.

+4

의미 론적으로 함수 매개 변수와 만 동일합니다. –

+0

배열은 여기에 참조로 전달되지 않습니다 (예, C++에서는 참조로 배열을 전달할 수도 있습니다). 대신 배열에 함수가 전달되면 값에 의해 전달되는 첫 번째 요소에 대한 포인터로 쇠퇴합니다. 하지만 코드 차이는 없습니다. – UncleBens

-1

두 표현식은 동일합니다.그들은 각각 arrayOfInt 배열의 첫 번째 요소의 주소를 평가합니다.

13

C++ 표준 13.1.3

- 만 배열 [] 대 포인터 *에 다를 매개 변수 선언은 동등하다. 즉, 배열 선언은 포인터 선언 (8.3.5)이되도록 조정됩니다. 매개 변수 유형이 (8.3.4) 인 경우 둘째 및 후속 배열 차원 만 중요합니다. [예 :

int f(char*); 
int f(char[]); // same as f(char*); 
int f(char[7]); // same as f(char*); 
int f(char[9]); // same as f(char*); 
int g(char(*)[10]); 
int g(char[5][10]); // same as g(char(*)[10]); 
int g(char[7][10]); // same as g(char(*)[10]); 
int g(char(*)[20]); // different from g(char(*)[10]); 

-end 예] 스타일 질문 나는 내 목을 내밀어 INT는 * arrayOfInt은 더 말할 것에

+0

좋은 예! 나는 그것에 대해 궁금해하고있다. 그래서 숫자가 컴파일러에 의해 버려지면, 2D 나 그 이상의 경우가 아니라면 마지막 숫자 만 유지된다. – bobobobo

1

. 어느 구문을 사용하든간에 포인터를 전달하고 유형이이를 분명하게해야합니다.

이것은 제 의견입니다.

+0

나는 내 목을 밖으로 붙잡을 것이고 동의한다. –

+2

너의 목이 보이고있다. – bobobobo