在以下代码中:
#include<stdio.h>
int main(int argc,char *argv[]){
int index;
for(index = 0; index < argc; index++) {
printf("The %d is %s\n",index,argv[index]);
}
return 0;
}
来自声明char *argv[]
的,cdecl表示这意味着
declare argv as array of pointer to char
,所以我认为代码应该这样写:
printf("The %d is %s\n",index,*argv[index]);
如下代码:
void give_me_ptr(int *ptr){
printf("the value of ptr is %p\n", ptr);
printf("the value of ptr is %d\n", *ptr);
}
int main(void){
int a = 10,index;
give_me_ptr(&a);
return 0;
}
事实证明
the value of ptr is 0x7fff76010b48
the value of ptr is 10
对我而言,这意味着我应该在指针变量之前添加*。
答案 0 :(得分:10)
在printf
函数中,格式说明符%s
需要指针作为相应参数的字符串的第一个字符。这就是你将argv[index]
传递给它的原因。 argv[index]
是一个指针。
如果你通过了*argv[index]
,那么你只会传递argv[index]
字符串的第一个字符,这是不正确的。 %s
需要指向第一个字符的指针,而不是字符本身。
答案 1 :(得分:4)
c样式的字符串说明符%s
需要一个字符指针指向字符串的第一个字符。在调用printf()
之类的东西时,它会将指针中的字符打印到最近的空字符。
%d
需要一个实际的整数,而不是一个指针。当您将字符串指向argv[index]
时,会转换为*argv+index
,这是指向位置编号的第一个字符的指针:index。
答案 2 :(得分:1)
要澄清两件事:
1)考虑argv的这种表示形式:
char *argv[] = { "./progname", "arg1", "arg2", NULL };
正如在符合标准的实现中给出的那样。现在argv的每个元素本身都是一个字符串(char指针),不需要取消引用它们 - 在这种情况下,你只得到字符串的第一个字符。
2)即使您希望为程序提供整数参数,也不要使用%d printf说明符 - 的参数始终作为字符串传递 !
答案 3 :(得分:1)
这就是printf
的行为:它使用带有%p
的指针或带有%s
的char的指针,但是带有%d
的整数。
[作为旁注:从技术上讲,argv
的类型为char **
,即使您将其声明为char * argv[]
。但是,它们是同义词。]