当我们从命令行获取参数时,如下所示:
int main(int argc, char *argv[]) { }
我的理解是argv是一个指针数组的指针,它指向传入的参数的地址。
由于这种情况,为什么我们可以使用
访问commnand line参数argv[i]
没有解除引用它,因为它包含指针?
答案 0 :(得分:2)
您忘记了通过它的起始地址访问字符串(char *
),而不是绝对值...您为字符串存储的值是多少?通用' 字符串'应该有多少内存?类型使用,因此' 字符串'是
C中的字符串由许多可打印字符组成,以nul(\0
)结尾。这些都存储在内存中。
char *argv[]
参数指定存在char *
个元素的数组。如上所述,char *
是一个字符串(或char
元素数组)。
char *argv[]
参数可以合法地声明为char **argv
。
例如,您可以打印字符串中每个字符的绝对值及其在内存中的地址:
#include <stdio.h>
int main(void) {
char *my_string = "Hello World";
int i;
for (i = 0; my_string[i] != '\0'; i++) {
printf("%c - 0x%02hhX - %p\n", my_string[i], my_string[i], &(my_string[i]));
}
return 0;
}
在这里,我们使用my_string[i]
解除引用指针以获取单个字符。
输出:
H - 0x48 - 0x400614
e - 0x65 - 0x400615
l - 0x6C - 0x400616
l - 0x6C - 0x400617
o - 0x6F - 0x400618
- 0x20 - 0x400619
W - 0x57 - 0x40061a
o - 0x6F - 0x40061b
r - 0x72 - 0x40061c
l - 0x6C - 0x40061d
d - 0x64 - 0x40061e
你可以像这样同时实现这个程序(注意解除引用):
#include <stdio.h>
int main(void) {
char *my_string = "Hello World";
char *s;
/* s = my_string
* is equivelant to:
* s = &(my_string[0]) */
for (s = my_string; *s != '\0'; s++) {
printf("%c - 0x%02hhX - %p\n", *s, *s, s);
}
return 0;
}
答案 1 :(得分:1)
在main函数中: int argc
是char *argv[]
数组指向的字符串数
int main(int argc, char *argv[]) { }
int argc:
int argc
定义main函数中传递的字符串数。
char * argv []:
char *argv[]
存储此数组中的每个单词/参数。
示例:
#include <stdio.h>
int main(int argc, char const *argv[]){
for(int i=0; i<argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
编译:
gcc -o c example.c
运行:
./ c一二有五四
输出
./c
one
two
there
four
five