第一个街区
#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
数组。我知道指针,但这里的语法仍然不懂。
发布于 2016-08-01 06:09:35
对于具有printf()
格式说明符的%s
,引用C11
,第7.21.6.1章
s
如果不存在l
长度修饰符,则参数应该是指向字符类型数组的初始元素的指针。..。
在你的情况下
printf("Value of names[%d] = %s\n", i, names[i] );
names[i]
是指针,这是%s
所要求的。这就是为什么,你不能取消引用指针。
FWIW,
%c
需要一个int
类型参数(转换为无符号字符),因此您需要取消引用指针以获得值。%d
还需要一个int
参数,所以您必须继续并取消引用指针,正如问题中提到的那样。发布于 2016-08-01 06:11:18
%d
转换说明符期望其相应的参数具有int
类型;ptr[i]
具有int *
类型,因此取消引用是必要的。
%s
转换说明符期望其相应的参数具有char *
类型;即指向char
的指针。所以names[i]
已经是正确的类型了。%s
说明符告诉printf
打印从给定位置开始的字符序列,直到看到字符串终止符为止。
发布于 2016-08-01 06:21:01
如果要打印每个char
数组的第一个字符,则在第二个示例中使用相同的语法。
printf("Value of names[%d] = %c\n", i, *names[i]);
但是,由于要打印C字符串,所以要传递names
数组元素的值,这些元素的类型为char *
。
https://stackoverflow.com/questions/38700986
复制