2

在以下代码中:

#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

4 回答 4

10

printf函数中,格式说明符%s需要一个指向字符串第一个字符的指针作为相应的参数。这就是你传递argv[index]给它的原因。argv[index]是一个指针。

如果你通过了*argv[index],你将只传递字符串的第一个字符argv[index],这是不正确的。%s需要指向第一个字符的指针,而不是字符本身。

于 2012-07-22T06:18:29.890 回答
4

c 风格的字符串说明符%s需要一个指向字符串第一个字符的字符指针。在调用类似的东西printf()时,它会将指针中的字符打印到最近的空字符。

%d另一方面,需要一个实际的整数,而不是指向整数的指针。当您将字符串指向 时argv[index],它会转换为*argv+index,它是指向位置编号:index 处第一个字符的指针。

于 2012-07-22T06:17:45.910 回答
1

需要澄清两点:

1)考虑argv的这种表示:

char *argv[] = { "./progname", "arg1", "arg2", NULL };

正如在符合标准的实现中给出的那样。现在 argv 的每个元素本身就是一个字符串(char 指针),不再需要取消引用它们——在这种情况下,你只得到字符串的第一个字符。

2) 即使您希望将整数参数提供给您的程序,也不要使用 %d printf 说明符——参数始终作为字符串传递

于 2012-07-22T06:19:29.217 回答
1

这就是printf行为方式:它使用带有 的指针%p或指向 char 的指针%s,但是带有 的整数%d

[附带说明:从技术上讲,argv是 type char **,即使您将其声明为char * argv[]. 但是,它们是同义词。]

于 2012-07-22T06:19:48.640 回答