C中的指针 - int数组VS char数组[重复]

问题描述 投票:-5回答:3

我知道有类似的问题,但这个问题特定于数组。

我可以做这个:

char *names[] = { "John", "Paul", "George", "Ringo" };

然后:

printf("%s\n", names[0]);

那为什么这不起作用?:

int *numbers[] = { 11, 12, 13, 14 };

printf("%d\n", numbers[0]);

谢谢

c arrays pointers
3个回答
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] );

0
投票

"John",...是char *类型。

11,...是int类型(没有间接)。

所以它是:

int numbers[] = { 11, 12, 13, 14 };
printf("%d\n", numbers[0]);

-1
投票

here解释了这个问题。

在第一个示例中,每个名称都是一个数组,并且您有一个数组数组。

char *names[] = { "John", "Paul", "George", "Ringo" };

在使用int的第二个示例中,您有一个简单的数组并使用* var [] = ** var但是在内存中没有这样的ting。

int *numbers[] = { 11, 12, 13, 14 };
© www.soinside.com 2019 - 2024. All rights reserved.