如果argv []是一个指针数组,printf(“%s”,argv [])怎么办?

时间:2012-07-22 06:14:17

标签: c pointers argv

在以下代码中:

#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

对我而言,这意味着我应该在指针变量之前添加*。

4 个答案:

答案 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[]。但是,它们是同义词。]