我知道有人问过类似的问题,但这个问题是特定于数组的。
我可以做到这一点:
char *names[] = { "John", "Paul", "George", "Ringo" };
然后:
printf("%s\n", names[0]);
那么为什么这不起作用?:
int *numbers[] = { 11, 12, 13, 14 };
printf("%d\n", numbers[0]);
谢谢
最佳答案
字符串文字具有字符数组类型。例如,字符串文字 "John"
的类型为 char[5]
(字符串文字包括终止零)。
在表达式数组中使用时,很少有异常(exception),会被转换为指向其第一个元素的指针。
你可以想象这个声明
char *names[] = { "John", "Paul", "George", "Ringo" };
喜欢
char *names[] = { &"John"[0], &"Paul"[0], &"George"[0], &"Ringo"[0] };
因此,数组 names
由字符串文字的第一个字符的有效地址初始化。
至于这个声明
int *numbers[] = { 11, 12, 13, 14 };
然后数组 numbers
由无效地址值(如 11、12 等)初始化,这些地址值不指向实际对象。
你可以这样写
int i = 11, j = 12, k = 13, l = 14;
然后
int *numbers[] = { &i, &j, &k, &l };
在这种情况下,数组将由有效地址初始化。
对于 printf
调用,该函数的设计方式是,当遇到转换说明符 s
时,该函数将相应的参数视为零地址-终止字符串并尝试输出该字符串。
而转换说明符d
用于输出int类型的对象。因此,例如,如果您想输出 numbers[0]
指向的整数,那么您应该编写
printf("%d\n", *numbers[0] );
关于c - C 中的指针 - int 数组 VS char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47855963/