programing

포인터를 argv로 포인터 표시

newsource 2023. 10. 2. 15:04

포인터를 argv로 포인터 표시

제가 이해한 바로는 포인터에서 포인터로 문자 배열을 가리켜서

% ./pointer one two

argv           
+----+          +----+
| .  |   --->   | .  |  ---> "./pointer\0"
+----+          +----+
                | .  |  ---> "one\0"
                +----+
                | .  |  ---> "two\0"
                +----+

코드에서:

int main(int argc, char **argv) {
    printf("Value of argv[1]: %s", argv[1]);
}

제 질문은 argv[1]이(가) 허용되는 이유는 무엇입니까?왜 (*argv)[1]과 같은 것이 아닌가요?

이해하는 단계:

  1. argv를 가져가서, 참조를 취소합니다.
  2. 포인터 배열의 주소를 문자로 반환해야 합니다.
  3. 포인터 산술을 사용하여 배열의 요소에 액세스합니다.

생각하기에 더 편리합니다.[]배열이 아닌 포인터를 위한 연산자로 사용되지만 배열이 포인터 배열 색인으로 붕괴되기 때문에 이런 식으로 본다면 여전히 의미가 있습니다.그래서 근본적으로 그것은 상쇄되고, 그 다음에는 추론, 포인터를 제거합니다.

그래서.argv[1], 당신이 정말로 가진 것은*(argv + 1)보다 편리한 구문으로 표현할 수 있습니다.이것은 당신에게 두번째를 줍니다.char *가 가리키는 기억 속에argv,부터char *유형입니다.argv를 가리키고, 그리고[1]간격띄우기argv타고sizeof(char *)바이트는 결과를 역참조합니다.

(*argv)[1]디레퍼런스(dereference)argv먼저*에 대한 첫 번째 포인터를 얻다char, 그 다음에 그것을 상쇄합니다.1 * sizeof(char)바이트, 그리고 그 다음에 A를 얻기 위한 역참조.char. 이것은 문자열 그룹의 첫번째 문자열에서 두번째 문자를 제공합니다.argv, 이건 분명히 우리가 생각하는 것과 같은 것이 아닙니다.argv[1].

따라서 인덱스 배열 변수를 "오프셋 후 포인터 참조 해제" 연산자에 의해 연산되는 포인터로 생각해 보십시오.

왜냐면argv는 에 대한 포인터입니다.char, 그 뒤를 잇습니다argv[1]에 대한 포인터입니다.char.그printf()체재를 갖추다%s에서는 포인터가 char 인수를 나타낼 것으로 예상하고 인수가 가리키는 null-terminal 문자 배열을 인쇄합니다.부터argv[1]null 포인터가 아니므로 문제가 없습니다.

(*argv)[1]또한 유효한 C이지만,(*argv)와 동치입니다.argv[0]그리고 에 대한 지시자입니다.char,그렇게(*argv)[1]의 두번째 캐릭터입니다.argv[0],어느 것이/예를 들어 보면

포인터를 배열로 인덱싱하는 것은 암시적으로 이를 참조하지 않습니다.p[0]*p,p[1]*(p + 1),기타.

언급URL : https://stackoverflow.com/questions/7631282/pointer-to-pointer-with-argv