포인터를 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]과 같은 것이 아닌가요?
이해하는 단계:
- argv를 가져가서, 참조를 취소합니다.
- 포인터 배열의 주소를 문자로 반환해야 합니다.
- 포인터 산술을 사용하여 배열의 요소에 액세스합니다.
생각하기에 더 편리합니다.[]
배열이 아닌 포인터를 위한 연산자로 사용되지만 배열이 포인터 배열 색인으로 붕괴되기 때문에 이런 식으로 본다면 여전히 의미가 있습니다.그래서 근본적으로 그것은 상쇄되고, 그 다음에는 추론, 포인터를 제거합니다.
그래서.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
'programing' 카테고리의 다른 글
maria db 10에서 체크인할 때 삽입 데이터에 대한 sql 구문 오류? (0) | 2023.10.02 |
---|---|
스위프트넘버상속 (0) | 2023.10.02 |
Angular 6에서 암호 유효성 확인 (0) | 2023.10.02 |
한 열의 값이 서로 다른 가장 최근의 레코드 3개를 선택합니다. (0) | 2023.10.02 |
jQuery 하이라이트 테이블 행 (0) | 2023.10.02 |