打印char数组时为什么不使用`*`?

时间:2016-12-27 10:37:33

标签: c arrays pointers char

例如:

#include <stdio.h>

const int MAX = 3;

int main () {

   int  var[] = {10, 100, 200};
   int i, *ptr[MAX];

   for ( i = 0; i < MAX; i++) {
      ptr[i] = &var[i]; /* assign the address of integer. */
   }

   for ( i = 0; i < MAX; i++) {
      printf("Value of var[%d] = %d\n", i, *ptr[i] );
   }

   return 0;
}

在上面的代码中*ptr[i]用于打印值,其中使用指向字符的指针数组,如下例所示,仅使用name[i]而不使用*

#include <stdio.h>

const int MAX = 4;

int main () {

   char *names[] = {
      "Zara Ali",
      "Hina Ali",
      "Nuha Ali",
      "Sara Ali",
   };

   int i = 0;

   for ( i = 0; i < MAX; i++) {
      printf("Value of names[%d] = %s\n", i, names[i] );
   }

   return 0;
}

2 个答案:

答案 0 :(得分:4)

informaticienzero一样,当printf(...)%d一起使用时,printf(...)期望您提供int值。但是,printf(...) %s要求您提供char*值。

在你的情况下:

ptr =&gt; int**ptr[i] =&gt; int**ptr[i] =&gt; int

names =&gt; char**names[i] =&gt; char*

printf(...)然后使用char*迭代字符,直到找到\0字符,这基本上是&#34;结束&#34;。此外,在使用常量数组时,请尝试使用sizeof运算符来确定数组的大小。这样您就不需要定义MAX。但是,在将数组传递给函数时,它会丢失其大小信息并sizeof无法正常工作。这意味着您应该将size作为单独的变量与数组一起传递。

答案 1 :(得分:2)

这是因为names[i]属于char*类型,而且它正是printf("%s")所期待的。使用*前面会有一个char

相反,ptr[i]的类型为int*。这是因为printf("%d")需要一个int*前需要ptr