2017-01-19 3 views
1

배열을 함수에 전달할 때 &을 사용해야합니까?문자 배열을 함수에 전달

아래 사례 1 또는 사례 2 중에서 어느 것이 좋습니까?

#define IP_ADDR_LEN 4 
char ip[4]={192,168,205,1}; 
char PeerIP[4]; 
int main() 
{ 
    memcpy(PeerIP,ip,IP_ADDR_LEN) 

    testip(PeerIP); /* Case 1 */ 

    testip(&PeerIP); /*Case 2*/ 
} 

int testip(char *ip) 
{ 
    /* IP check */ 

} 
+0

호출하기 전에'testip()'을 선언 (또는 정의)해야한다는 것에주의하십시오. 그렇게하면, 컴파일러는'testip (& PeerIP);'호출이 함수에 잘못된 타입을 넘겨주고 있다고 말할 수 있습니다. 그것은'int *'가 아니라'int (*) [4] '입니다. 그것이 통과되고있다. 엄격한 프로토 타입을 사용하여 컴파일러가 사용되기 전에 정의되거나 선언 된 함수를 주장하고 사용하는 방법을 알아보십시오. –

답변

2

첫 번째 것.

testip(PeerIP); 

배열 이름은 함수 호출의 파라미터에 대한 예상 유형과 일치하는 어레이의 첫 번째 요소에 대한 포인터로 소멸되므로, 그것을 올바른 방법이다.

는 정교하게하려면 코드에서, testip() 유형 char *의 인수를 기대하고 testip(PeerIP);처럼 호출하여 당신은 char *를 통과, 그래서 더 문제가된다.

이 경우는 &PeerIP 사용 유형 [char (*) [4]] 배열에 대한 포인터 배열 [char *]의 첫 번째 요소 하지 포인터되며 서로 다른 유형이다. 그것은 sizeof 연산자의 피연산자 경우를 제외 C11 챕터 §6.3.2.1, Lvalues, 배열 및 기능 부호 (강조 광산)

을 인용

상기 _Alignof 연산자 또는 단항 & 연산자 또는 배열을 초기화하는 데 사용되는 문자열 리터럴 ''배열의 유형 ''은 유형이 인 '포인터를 입력 할' 인 표현식으로 변환되며 배열 객체의 초기 요소에 을 가리키며 좌변 값이 아닙니다입니다. [...]

+0

다른 유형이지만 둘 모두가 동일한 주소를 가리 킵니다. 포인터 연산 만 다릅니다. – StoryTeller

+1

@StoryTeller가 맞지만 여전히 __later는 틀립니다 .____. 같은 주소를 가리키고 있기 때문에 표현이 바뀌지는 않습니다. 유형이 중요합니다. :) –

+0

그들은 참으로 대단히 중요합니다. 방금 C++ 배경 팝업이 나타났습니다. 배열 참조에 대한 캐스팅 포인터는 "사실"덕분에 그 사실을 알 수 있습니다 :) – StoryTeller