我正在阅读C Primer Plus中关于命令行参数argv
的一节,我很难理解这句话。
它说,
程序将命令行字符串存储在内存中并存储 指针数组中每个字符串的地址。这个地址 数组存储在第二个参数中。按照惯例,这个指针指向 对于参数值,指针称为
argv
。
这是否意味着命令行字符串作为指向char
数组的指针数组存储在内存中?
答案 0 :(得分:23)
argv
的类型为char **
。 它不是数组。它是指向char
的指针。命令行参数存储在存储器中,每个存储器位置的地址存储在一个数组中。该数组是指向char
的指针数组。 argv
指向此数组的第一个元素。
Some array +-------+ +------+------+-------------+------+ argv ----------> | | | | | | | | 0x100 +------> | | | . . . . . . | | Program Name1 0x900 | | | | | | | | | +------+------+-------------+------+ +-------+ 0x100 0x101 | | +------+------+-------------+------+ | 0x205 | | | | | | 0x904 | +------> | | | . . . . . . | | Arg1 | | . | | | | | +-------+ +------+------+-------------+------+ | . | . 0x205 0x206 | . | | . | . | . | +-------+ . +------+------+-------------+------+ | | | | | | | | 0x501 +------> | | | . . . . . . | | Argargc-1 | | | | | | | +-------+ +------+------+-------------+------+ | | 0x501 0x502 | NULL | | | +-------+ 0xXXX Represents memory address
<子> 1。在大多数情况下,argv[0]
表示程序名称,但如果主机环境中没有程序名称,则argv[0][0]
表示空字符。 子>
答案 1 :(得分:15)
直接引用C11
,章节§5.1.2.2.1/ p2,程序启动,(强调我的)
int main(int argc, char *argv[]) { /* ... */ }
[...]如果
argc
的值大于零,数组成员argv[0]
通过argv[argc-1]
包含字符串指针,[...]
和
[...]以及
指向的字符串argv
数组[...]
因此,基本上,argv
是指向字符串 note 数组的第一个元素的指针。这可以通过替代形式,
int main(int argc, char **argv) { /* ... */ }
你可以将它改为指向指向以null结尾的char
数组的第一个元素的指针数组的第一个元素的指针,但我更喜欢坚持使用字符串。
注:
在上面的答案中阐明“指向数组的第一个元素的指针”的用法,遵循§6.3.2.1/ p3
除非它是
sizeof
运算符,_Alignof
运算符或者&
运算符的操作数。 一元function changeTopic(sel){ var topicId = sel.value; document.topicSelectionFormId.action = topicId; document.topicSelectionFormId.submit(); }
运算符,或者是用于初始化数组的字符串文字,一个表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素并且不是左值。 [...]
答案 2 :(得分:11)
这个线程是这样的火车残骸。情况如下:
argc+1
char *
元素的数组。argv
指向该数组的第一个元素。argc
个其他类型char
的数组和各种长度,包含表示命令行参数的空终止字符串。char
数组之一的第一个字符;除了指针数组的最后一个元素,它是一个空指针。有时人们写&#34;指向X&#34;表示&#34;指向X&#34;数组的第一个元素的指针。你必须使用上下文和类型来确定它们是否确实意味着它。
答案 3 :(得分:0)
是的,确实。
argv
是char**
或char*[]
,或者只是一个char *指针数组。
所以argv [0]是char*
(字符串),argv[0][0]
是char
。
答案 4 :(得分:0)
是
argv
的类型是char**
,即指向char
指针的指针。基本上,如果您认为char*
是一个字符串,那么argv
是指向字符串数组的指针。
答案 5 :(得分:0)
argv
是一个指向字符的指针数组。
以下代码显示argv
的值,argv
的内容,并在argv
的内容指向的内存上执行内存转储。希望这能说明间接的含义。
#include <stdio.h>
#include <stdarg.h>
print_memory(char * print_me)
{
char * p;
for (p = print_me; *p != '\0'; ++p)
{
printf ("%p: %c\n", p, *p);
}
// Print the '\0' for good measure
printf ("%p: %c\n", p, *p);
}
int main (int argc, char ** argv) {
int i;
// Print argv
printf ("argv: %p\n", argv);
printf ("\n");
// Print the values of argv
for (i = 0; i < argc; ++i)
{
printf ("argv[%d]: %p\n", i, argv[i]);
}
// Print the NULL for good measure
printf ("argv[%d]: %p\n", i, argv[i]);
printf ("\n");
// Print the values of the memory pointed at by argv
for (i = 0; i < argc; ++i)
{
print_memory(argv[i]);
}
return 0;
}
示例运行:
$ ./a.out Hello World!
argv: ffbfefd4
argv[0]: ffbff12c
argv[1]: ffbff134
argv[2]: ffbff13a
argv[3]: 0
ffbff12c: .
ffbff12d: /
ffbff12e: a
ffbff12f: .
ffbff130: o
ffbff131: u
ffbff132: t
ffbff133:
ffbff134: H
ffbff135: e
ffbff136: l
ffbff137: l
ffbff138: o
ffbff139:
ffbff13a: W
ffbff13b: o
ffbff13c: r
ffbff13d: l
ffbff13e: d
ffbff13f: !
ffbff140:
$
你有一个大的连续数组,范围从ffbff12c
到ffbff140
,其中包含命令行参数(这不能保证是标准的连续,但它是如何一般的完成)。 argv
只包含指向该数组的指针,因此您可以知道在哪里查找单词。
argv
是指针......指向字符