我知道有类似的问题,但这个问题特定于数组。
我可以这样做:
char *names[] = { "John", "Paul", "George", "Ringo" };
然后:
printf("%s\n", names[0]);
那么为什么这不起作用?:
int *numbers[] = { 11, 12, 13, 14 };
printf("%d\n", numbers[0]);
由于
答案 0 :(得分:2)
字符串文字具有字符数组的类型。例如,字符串文字"John"
的类型为char[5]
(字符串文字包括终止零)。
在表达式中使用具有罕见异常的数组将转换为指向其第一个元素的指针。
你可以想象这个宣言
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] );
答案 1 :(得分:0)
"John"
,...类型为char *
。
11
,...属于int
类型(没有间接)。
所以它是:
int numbers[] = { 11, 12, 13, 14 };
printf("%d\n", numbers[0]);
答案 2 :(得分:-1)
此问题已解释为here。
在第一个示例中,每个名称都是一个数组,并且您有一个数组数组。
char *names[] = { "John", "Paul", "George", "Ringo" };
在带有int的第二个例子中,你有一个简单的数组并使用* var [] = ** var但是你没有这样的内存。
int *numbers[] = { 11, 12, 13, 14 };