【问题标题】:2 ways of accessing value of an array of pointers in C2种访问C中指针数组值的方法
【发布时间】:2016-12-06 15:50:36
【问题描述】:

第一块

#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 是一个 int 指针数组。因此,当您需要访问i-th 元素时,您需要将其值取消引用为*ptr[i]

现在是第二个块,也一样,只是现在指向一个char指针数组:

#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;
}

这一次,当我们需要访问它的元素时,为什么不先添加一个*

我试图形成一个正确的语句来打印这个值,似乎如果你取消引用,它将是一个单一的字符。为什么?

printf("%c", *names[1]) // Z

我知道 C 中没有字符串,它是一个 char 数组。而且我知道指针,但仍然不符合这里的语法。

【问题讨论】:

  • 因为我们需要访问的元素是地址。 %s 告诉 printf 打印从给定地址开始的所有字符,直到遇到 0。在您的示例中,给定地址是 names[i] 的值。 %c 告诉printf 打印给定字符。在您的示例中,给定字符是*names[i] 的值,相当于names[i][0]

标签: c arrays pointers printf format-specifiers


【解决方案1】:

对于带有%s 格式说明符的printf(),引用C11,第7.21.6.1 章

s
如果不存在l 长度修饰符,则参数应为指向初始值的指针 字符类型数组的元素。 [...]

在你的情况下,

 printf("Value of names[%d] = %s\n", i, names[i] );

names[i] 指针,正如%s 所要求的那样。这就是为什么你不取消引用指针。

FWIW,

  • %c 需要 int 类型参数(转换为 unsigned char,),因此您需要取消引用指针以获取值。
  • %d 还需要 int 参数,因此您必须继续并取消引用指针,如问题中所述。

【讨论】:

    【解决方案2】:

    %d 转换说明符期望其对应的参数具有 int 类型; ptr[i] 的类型为 int *,因此需要取消引用。

    %s 转换说明符期望其对应的参数具有char * 类型;也就是说,一个指向char指针。所以names[i] 已经是正确的类型。 %s 说明符告诉printf 打印从给定位置开始的字符的序列,直到它看到字符串终止符。

    【讨论】:

      【解决方案3】:

      如果您要打印char 的每个数组的第一个字符,您将在第二个示例中使用相同的语法:

          printf("Value of names[%d] = %c\n", i, *names[i]);
      

      但由于您想打印 C 字符串,您需要传递 names 数组的元素值,它们的类型是正确的,char *

      【讨论】:

        【解决方案4】:

        printf() 有自己的处理格式类型说明符的方式。对于字符串,即字符数组,它需要%s 说明符和char * 类型的指针作为对应的参数。当printf() 收到此指针时,它会谨慎地取消引用它以打印char 类型的字符。所以,这就是为什么当你想打印字符串时传递一个指针而不是取消引用。

        【讨论】:

          猜你喜欢
          • 2016-04-21
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          • 2021-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多