2012-12-21 3 views
2

이 점에 대해 이해 해주십시오.Cpp 포인터 및 배열

"char *** argv"이 필요한 기능이 있습니다.

필자가 아는 한 : 포인터의 배열에 대한 포인터에 대한 포인터.

이와 비슷한 내용 : "char * arr []"?

char xx1 = '1'; 
char xx2 = '2'; 
char *argv[] = {&xx1,&xx2}; 

는 그럼 난 gtk_init (&는 argc, & ARGV) 내 함수를 호출;

얻을 오류 :

main.cpp:43:31: error: cannot convert ‘char* (*)[2]’ to ‘char***’ for argument ‘2’ to ‘void gtk_init(int*, char***)’ 

어떤 도움 주셔서 감사합니다.

+0

닫기. 'char * arr []'은 배열을 가리키는 포인터가 아니라 배열을 가리키는 포인터입니다. –

+0

각'*'를'to pointer '로 대체하십시오. 가장 왼쪽에있는 유형을 추가하십시오. –

+0

*** argv는 포인터에 대한 포인터입니다. 포인터에있는 내용에 따라 3 차원 배열의 동의어가 될 수 있습니다. – RonaldBarzell

답변

4

char***은 "char 포인터에 대한 포인터 포인터"입니다. 배열이 전혀 필요 없습니다. argv은 "char에 대한 2 포인터의 배열"입니다. 배열의 이름 argv은 특정 상황에서 첫 번째 요소에 대한 포인터로 부패합니다.이 포인터의 형식은 char** 또는 "char 포인터의 포인터"입니다.

&argv을 수행하면 char* (*)[2] 또는 "2의 포인터 배열에 대한 포인터"가 나타납니다. 네가 원하는게 아니야. 왜냐하면 포인터가 아닌 배열의 주소를 사용하기 때문입니다.

또한 argv의 포인터가 NULL 종료 문자열이 아닌 char을 가리키고 있다는 사실에 문제가있을 것입니다. gtk_init은 거의 확실히 null로 끝나는 문자열을 기대할 것입니다.

그럼 어떻게 할 수 있습니까? 우리가 const가 아닌가되도록 char의 필요하기 때문에

char xx1[] = "1"; // Now these are null-terminated strings 
char xx2[] = "2"; 
char* argv[] = {xx1, xx2}; 
char** argvp = argv; // Use the fact that the array will decay 
gtk_init(&argc, &argv); // &argv will now be a char*** 

문자열에 대한 배열을 사용하는 이유는,하지만 char* str = "hello"; 스타일 선언은 사용되지 않습니다 - 그것은 const char*을해야합니다 :이보십시오. 그러나 배열을 사용하면 문자열 리터럴의 내용이 배열에 복사되므로 자유롭게이를 const으로 만들 수 있습니다.

gtk_init 정말 그냥 그렇게처럼 당신의 주요 기능의 argcargv 매개 변수를 전달하는 기대? &argv 이제 허용되는 이유

int main(int argc, char* argv[]) 
{ 
    gtk_init(&argc, &argv); 
    // ... 
} 

이제 물어 "하지만 수 argv가 동일한 유형으로하다 다시 말해 배열에 대한 포인터를 얻지 않는 이유는 무엇입니까? " 실제로, argv은 그 모양이 얼마인지에 관계없이 같은 유형이 아닙니다. 배열 인수를 취하는 함수를 정의하면 실제로 포인터로 변환됩니다. 그래서 main의 정의와 동일하기 :

int main(int argc, char** argv); 

그래서 우리는 &argv을 할 때 우리에게 char***을 제공하기 때문에, 우리는 완전히 괜찮아요.

@OmnipotentEntity가 의견에서 말한 것처럼 main의 매개 변수를 gtk_init으로 전달하지 않는 것이 좋을 것입니다.

+2

'gtk_init'은 주인의'argc'와'argv'를 사용하기위한 것이므로 특별한 것이나 이상한 것을하지 않는다면, 그냥 넘겨 주면됩니다. – OmnipotentEntity

+0

@ OmnipotentEntity 귀하의 의견은 가치있는 메모입니다. :) 편집 : 사실, 내가 편집 할 것입니다. –

+0

예 이상한 물건을하고 있어요. Haxe에서 GTK를 사용하려고 했으므로 일부 haxe 함수를 cpp에 바인딩합니다. 대단히 고맙습니다. – somerandomusername