2012-10-27 2 views
-1

숯 **을 처음 접했을 때 나는 혼란스러워졌습니다. 끈에 대처하는 것이 정말로 필요한가요? 예를 들어
:char ** 문자열에 대응하고 싶습니까?

double strtod(const char *nptr,char **endptr); 

endptr이 NULL이 아닌 경우, 스캔을 정지 문자에 대한 포인터가 위치에 저장되어 endptr에 의해 지적했다. --- MSDN
이것은 매우 복잡합니다. 왜 문자를 가리키는 포인터를 endptr으로 복사하지 않으십니까? 호출 후 모든 계산은 포인터의 값을 endptr으로 전달하여 얻을 수 있다고 생각합니다.
char**이 정말로 필요합니까?

+3

변경해야하는'char *'을 전달하기 때문에'char **'가 필요합니다. – chris

+1

실수로 C :로 흘러 들어가는 작은 종류의 안전 장치입니다. –

답변

0

상상은 my_type라는 유형이, 그리고 당신은 함수가 수정할 수 있도록 my_type에 대한 포인터를 필요로 foo()라는이 : 실제로 정의하는 방법을 my_type 볼 수 있습니다,

void foo(my_type *t); 

을 지금을 :

typedef char* my_type; 

유형이 이미 포인터인지 여부는 중요하지 않습니다. 포인터를 해당 유형의 변수에 전달하려면 해당 주소가 필요합니다. 그래서의 분해 :

my_type *t 

은 다음과 같습니다

char **t 

당신이 유형 char *의 변수에 대한 포인터를 할 때마다, 당신은 char **이 필요합니다.

2

C의 인수는 값으로 전달됩니다. 함수의 호출자가 함수에 전달 된 인수에 대한 변경 사항을 보려면 함수의 인수 주소를 전달해야합니다. 이것이 char**이 전달 된 이유입니다. 호출자는 char* 유형의 변수를 가지며 해당 주소를 전달합니다. 함수에서 변경된 경우 호출자는 해당 변경 사항을 볼 수 있습니다. 예를 들어

:

void set_int(int i) { i = 4; } 

/* Caller */ 
int x = 7; 
set_int(x); 
/* 'x' is still 7 */ 

void really_set_int(int* i) { *i = 4; } 

/* Caller */ 
int x = 7; 
really_set_int(&x); 
/* 'x' is now 4 */ 

char* 형의 변수에 대해 동일한 동작. 함수가 (내용이 아님)을 가리키는 char*인 것을 변경해야하는 경우 char*의 주소 (char**)가 필요합니다.

+0

그래서 "char * endptr"을 전달하고 "endptr = 0x30160700"(예 :)을 사용하면 함수 외부의 "endptr"의 실제 값은 그대로 유지됩니까? – Al2O3

+0

@Rubby, no. 호출 후'endptr'은 다른 위치를 가리킬 것입니다. – hmjd

+0

매개 변수로 "char * endptr"을 의미합니다 .. – Al2O3