char**argv를 사용할지 char*ar*argv[]를 사용할지 여부
저는 지금 막 C를 배우고 있는데, 이 중 어떤 것을 메인 방법으로 사용해야 할지 고민하고 있습니다.차이가 있나요?어떤 게 더 흔한가요?
C를 배운 지 얼마 안 되었기 때문에 공통적인 것이 아니라 어레이와 포인터의 차이점을 먼저 이해하도록 노력하시기 바랍니다.
파라미터 및 어레이 분야에서는 계속 진행하기 전에 몇 가지 혼란스러운 규칙이 있습니다.먼저 파라미터 목록에서 선언한 내용은 특별 취급됩니다.C의 함수 파라미터로서 의미가 없는 경우가 있습니다.이것들은
- 파라미터로서의 기능
- 파라미터로서의 어레이
파라미터로서의 어레이
두번째는 아마도 바로 명확하지 않을 것이다.그러나 배열 치수의 크기가 C의 유형의 일부라는 것을 고려하면 명확해집니다(및 치수 크기가 지정되지 않은 배열은 불완전한 유형을 가집니다).따라서 값별로 배열(복사본을 수신)하는 함수를 만들 경우 한 가지 크기만 사용할 수 있습니다.또한 어레이가 커질 수 있으므로 C는 가능한 한 고속화를 시도합니다.
C에는 이러한 이유로 배열 값이 존재하지 않습니다.배열 값을 가져오려면 대신 해당 배열의 첫 번째 요소에 대한 포인터만 가져옵니다.그리고 여기에는 이미 해결책이 있습니다.C 컴파일러는 비활성 배열 파라미터를 사전에 그리는 대신 각 파라미터의 유형을 포인터로 변환합니다.이거 기억해, 아주 중요해.매개 변수는 배열이 아니라 각 요소 유형에 대한 포인터가 됩니다.
어레이를 전달하려고 하면 어레이의 첫 번째 요소에 대한 포인터가 대신 전달됩니다.
Excursion(익스커전):파라미터로서의 기능
완성하기 위해서, 그리고 이것이 문제를 더 잘 이해하는 데 도움이 된다고 생각하기 때문에, 당신이 어떤 기능을 매개 변수로 삼으려고 할 때 어떤 상황인지 살펴봅시다.사실, 우선 그것은 말이 되지 않을 것이다.파라미터가 함수가 될 수 있습니까?아, 물론 그 곳에 변수가 있어야죠!이 경우 컴파일러는 함수를 함수 포인터로 변환합니다.함수를 전달하려고 하면 해당 함수에 포인터가 대신 전달됩니다.따라서 다음과 같습니다(배열 예시와 유사).
void f(void g(void));
void f(void (*g)(void));
괄호 안쪽에 주의해 주세요.*g
필요합니다.그렇지 않으면 함수가 반환됩니다.void*
반환되는 함수에 대한 포인터 대신void
.
어레이로 돌아가다
처음에 어레이의 타입이 불완전할 수 있다고 말씀드렸습니다.아직 크기를 지정하지 않으면 어레이가 불완전해질 수 있습니다.어레이 파라미터는 존재하지 않지만 어레이 파라미터는 포인터이기 때문에 어레이의 크기는 중요하지 않습니다.즉, 컴파일러는 다음 내용을 모두 번역하며 모두 동일합니다.
int main(int c, char **argv);
int main(int c, char *argv[]);
int main(int c, char *argv[1]);
int main(int c, char *argv[42]);
물론 어떤 사이즈라도 넣을 수 있다는 것은 말이 안 되고 그냥 버려져 버립니다.그 때문에, C99 는 이러한 숫자에 새로운 의미를 부여해, 괄호 사이에 다른 것을 표시할 수 있게 되었습니다.
// says: argv is a non-null pointer pointing to at least 5 char*'s
// allows CPU to pre-load some memory.
int main(int c, char *argv[static 5]);
// says: argv is a constant pointer pointing to a char*
int main(int c, char *argv[const]);
// says the same as the previous one
int main(int c, char ** const argv);
마지막 두 줄은 함수 내에서 "argv"를 변경할 수 없음을 나타냅니다. 이 함수는 상수 포인터가 되었습니다.단, 이러한 C99 기능을 지원하는 C 컴파일러는 거의 없습니다.그러나 이러한 기능을 통해 '어레이'가 실제로는 아니라는 것을 알 수 있습니다.포인터예요.
경고 한마디
위의 내용은 배열을 함수의 파라미터로 했을 경우에만 해당됩니다.로컬 어레이를 사용하는 경우 어레이는 포인터가 되지 않습니다.앞에서 설명한 바와 같이 어레이는 값을 읽을 때 포인터로 변환되기 때문에 포인터로 동작합니다.그러나 그것은 포인터와 혼동해서는 안 된다.
대표적인 예는 다음과 같습니다.
char c[10];
char **c = &c; // does not work.
typedef char array[10];
array *pc = &c; // *does* work.
// same without typedef. Parens needed, because [...] has
// higher precedence than '*'. Analogous to the function example above.
char (*array)[10] = &c;
어느쪽이든 상관없습니다.그들은 완전히 같다.Litb의 댓글과 그의 답변을 보세요.
실제로 사용하는 방법에 따라 달라집니다(어느 경우든 사용할 수 있습니다).
// echo-with-pointer-arithmetic.c
#include <stdio.h>
int main(int argc, char **argv)
{
while (--argc > 0)
{
printf("%s ", *++argv);
}
printf("\n");
return 0;
}
// echo-without-pointer-arithmetic.c
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for (i=1; i<argc; i++)
{
printf("%s ", argv[i]);
}
printf("\n");
return 0;
}
어떤 것이 더 흔한가 하는 것은 중요하지 않다.코드를 읽어본 경험이 있는 C프로그래머는 이 두 가지를 (적절한 조건 하에서) 교환할 수 있는 것으로 간주합니다.경험이 많은 영어 사용자가 "they's"와 "themes"를 똑같이 쉽게 읽는 것처럼.
더 중요한 것은 그것들을 읽는 법을 배우고 그것들이 얼마나 비슷한지 인식하는 것이다.쓰는 것보다 더 많은 코드를 읽게 되고, 두 가지 모두에 똑같이 익숙해질 필요가 있습니다.
차이는 없지만, 저는 이 두 가지를char *argv[]
가 가변 길이 문자열의 고정 크기 배열임을 보여주기 때문입니다(보통char *
를 참조해 주세요.
.char *argv[]
선언하는 방법은 여러 가지가 있기 때문에 스트링 배열이라는 직관적인 의미에 가장 가깝습니다.
어느 쪽이든 다른 쪽 방법 대신 사용하는 것이 특별한 메리트는 없다고 생각합니다.코드의 나머지 부분과 가장 일치하는 규칙을 사용합니다.
C 배열과 같이 두 가지 형식 중 하나를 사용할 수 있으며 함수 매개 변수 목록에서 포인터를 서로 바꿀 수 있습니다.http://en.wikipedia.org/wiki/C_(programming_language)#Array-pointer_interchangeability 를 참조해 주세요.
차이가 있는 것은 아니지만, 후자가 더 읽기 쉽다.두 번째 버전에서 말하는 것과 같은 문자 포인터의 배열이 주어집니다.단, 첫 번째 버전과 마찬가지로 이중 문자 포인터로 암묵적으로 변환할 수 있습니다.
char ** → 문자 포인터에 대한 포인터 및 char *pointerv []는 문자 포인터의 배열을 의미합니다.배열 대신 포인터를 사용할 수 있기 때문에 둘 다 사용할 수 있습니다.
문자열의 수가 다양하거나 동적이어야 하는 경우 char**를 사용하는 것이 더 쉽습니다.문자열 수가 고정된 경우 char* var []가 좋습니다.
이것이 구식인 것은 알지만, C 프로그래밍 언어를 배우고 있을 뿐이고 큰 작업은 하지 않을 경우에는 명령줄 옵션을 사용하지 마십시오.
명령줄 인수를 사용하지 않는 경우 둘 다 사용하지 마십시오. ' 기능'이라고 하면 됩니다.int main()
당신이
- 프로그램 사용자가 프로그램으로 파일을 끌어다 놓으면 프로그램 결과를 변경할 수 있습니다.
- 옵션명령줄 옵션)을 합니다.
-help
,/?
" " " 뒤에 것program name
명령어프롬프트 ('단말기' 또는 '명령어프롬프트')
어느쪽이든 당신이 납득할 수 있는 것을 사용하세요.않으면 ''를 사용하세요.int main()
명령줄 옵션을 추가할 경우 나중에 쉽게 편집할 수 있습니다.
언급URL : https://stackoverflow.com/questions/779910/should-i-use-char-argv-or-char-argv
'sourcecode' 카테고리의 다른 글
Gradle: '11.0.2'에서 Java 버전을 확인할 수 없습니다. (0) | 2022.08.17 |
---|---|
nl80211 라이브러리 및 cfg80211 구조 (0) | 2022.08.16 |
vue 및 multer를 사용한 Axios 다중 업로드 (0) | 2022.08.16 |
Vuex가 정의되지 않은 속성 '상태'를 읽을 수 없음 (0) | 2022.08.16 |
Vue 및 Vuex를 사용하여 Firebase 인증이 작동하지 않음 (0) | 2022.08.16 |