第一个块
#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
数组。我知道指针,但仍然不在这里的语法。
答案 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
类型的字符。因此,这就是为什么你传递一个指针,并且在你想要打印字符串时不要取消引用。