在C中访问指针数组的两种方法

时间:2016-08-01 14:07:16

标签: c arrays pointers printf format-specifiers

第一个块

#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个元素时,需要将其值取消引用为*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;
}

这次,当我们需要访问其元素时,为什么我们不首先添加*

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

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

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

4 个答案:

答案 0 :(得分:2)

printf() %s格式说明符,引用C11,章节§7.21.6.1

  

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

在你的情况下,

 printf("Value of names[%d] = %s\n", i, names[i] );
根据{{​​1}}的要求,

names[i] 指针。这就是为什么,你不要取消引用指针。

FWIW,

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

但是,由于您要打印C字符串,因此传递names数组元素的值,这些元素的类型正确为char *

答案 3 :(得分:0)

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