2010-03-08 5 views
1

**은 C에서 특별한 의미가 있습니까? 이처럼C에서 ** 연산자는 무엇을 의미합니까?

:

static intparse_one (int argc, char **argv) 
{ 
    cmd_line  *slot; 
    int    value; 
    Flag_name  flag_name; 
    int   i; 

printf("argv %s\n",argv); 
printf("argv[0] %c\n",**argv); 

그렇다면, 라인

**argv 

메이크업의 의미는 무엇입니까? 내가 실행하려고하는 프로그램은 그것에 질식입니다. 인쇄하려고하면 segmentation fault이 나옵니다.

첫 번째 printf는 fine 문자열을 인쇄합니다. 두 번째 printf가 실패합니다. 여기

는 (첫 번째 줄이 정확) 나는 출력 얻고 무엇을 :

argv -aps_instance1001-aps_ato0-aps_ipc_debug3 

Segementation Fault (core dumped) 
+0

"질식"이란 무엇을 의미합니까? 그 비교는 유효합니다. 본질적으로 첫 번째 인수의 첫 번째 문자가 하이픈인지 확인합니다. (아마도 첫 번째 인수는 일반적으로 getopt-style 플래그가 아닌 이진 파일 이름이므로 의미하는 것이 아닙니다.) –

답변

9

는 "**은 C에서 특별한 의미를 가지고 있는가 ? "

아니요, 단지 두 개입니다. dereferences입니다.

char **argv 

의미 : argv 두 번 char 간접 참조이다. 즉, argvchar에 대한 포인터에 대한 포인터입니다.


같은 경우 :

"그렇다면, 선 수행합니다? **argv 메이크업 감각"

선언문에 **argvchar입니다. 런타임에 argv은 두 번 참조 해제됩니다. 값은 charargv이고, 포인터는 char을 가리키는 포인터입니다.

0

가되지 않은 포인터에 대한 포인터가? argv 매개 변수 앞에있는 **는 C#에서 ref과 동일한 효과가 있다고 생각합니다.

1

예.

문자 ** argv를

문자와 같은 일이 * 변수는 argv []

1

모든 * 번호

는 간접 수준을 소개합니다. 이 문맥에서는 argv이 포인터에 대한 포인터임을 의미합니다. 그렇지 않습니다. 실제로는 기술적으로 포인터 배열을 볼 수 있습니다. char * argv[]으로 선언 할 수 있습니다.

분명히 "아니오"로, 나는 **이 그 자체로 특별한 것이 아니라는 것을 의미합니다. 아니면 특별하지만, * 또는 ***도 아니고 아니도 않습니다.

1

char **argvchar *argv[]과 동일합니다.

여기서 argv은 인수 벡터입니다.

0

문자열 "**"은 잘 정의 된 의미가 있지만 질문에 대한 대답은 "**"은 하나의 연산자가 아니라 두 개의 "*"이 연속으로 나온 것입니다.

이것은 Fortran과 대조되는데, 여기서 "**"은 단일 토큰이며 지수 연산자로 사용됩니다.

그래서 의미는 well covered by Martin Beckett이지만 실제로는 "연산자"가 아닙니다.

2

**은 단지 두 개의 *입니다.

segfault가가는 한, printf("argv %s\n",argv); 라인을보십시오. printf은 이 아니라 char **이 아니기 때문에 문자 배열이 아닌 포인터 배열을보고 있습니다. printf은 0을 만날 때까지 argv에있는 모든 문자를 문자열로 표시하려고 시도하고 있으며, 문자가 발견되기 전에 범위를 벗어납니다.

argv 포인터 배열을 포인터에 대한 포인터를, 또는이 경우에는 char **이다. 외부 의미가 없으므로 직접 인쇄하지 마십시오. (당신은 물론, 그것을보고 싶다면 당신은 포인터 값을 인쇄 할 수 있습니다.)

*argv 또는 argv[0]char *이며,이 경우 argv의 첫 번째 문자열 char에 대한 포인터가된다.

**argvchar이며,이 경우 첫 번째 문자열의 첫 번째 문자는 argv입니다.

관련 문제