C初始化指向数组文字的指针而不需要额外的变量

时间:2018-04-21 17:35:14

标签: c arrays

我有一个需要保存指向数组的指针的变量。 通常,这是通过首先使用数组创建变量,然后将指针保存到该变量来完成的。但是,我需要对10个变量执行此操作,并且我不想为每个变量创建额外的数组。 我最初尝试的是

int *numList = {1, 2, 3};

但是这会尝试创建一个指向整数的指针数组。我认为以下列表的类型正确,但我不知道如何将数组转换为指针。

int (*numList)[3] = {1, 2, 3};

4 个答案:

答案 0 :(得分:4)

在C99和C11中,您可以使用compound literal来实现问题标题中的请求,即初始化指针使其指向不带任何额外变量的数组文字:

int *numList = (int []){ 1, 2, 3 };

numList指向的数组与指针本身具有相同的范围和生命周期 - 如果它在函数内部,则持续它定义的块,或者如果是,则持续到程序的持续时间。在任何功能之外。

如果你被误导成在一个函数中创建static int *numList = (int []){ 1, 2, 3};,你就会为自己创造一个受伤的世界 - 不要这样做。 (在文件范围内,在任何函数之外,它不会出现任何问题。)指针将在不迟于首次调用函数时初始化,但不能保证它指向的内容具有static持续时间和后续的电话可能指向垃圾。

答案 1 :(得分:0)

标准说:

  

除非它是sizeof运算符或一元&的操作数。   operator,或者是用于初始化数组的字符串文字, an   具有类型''数组类型''的表达式将转换为   带有''指向类型''的指针的表达式,指向初始值   数组对象的元素,而不是左值。

您可以将数组分配为int[]类型,因为“数组将数组转换为指针”不是必需的,因为数组可能会自行衰减为指针。

简而言之,从实际角度int[] 被视为,就像int*一样。数组是有效指向其第一个元素的指针:

int array[] = { 1, 2, 3 };

现在,您可以将此对象传递给具有原型void func(int *array);的函数,而不将其转换为int *。也就是说,您可以将其称为func(array)

关于这一点的一些相关事实是array == &array。因此,您永远不需要将数组显式地转换为指针,因为这将是多余的。

查看What is array decaying?了解详情。

答案 2 :(得分:-1)

数组名称本身是指向数组第一个元素的指针。

即,在您的示例中,

int numList[3]={1,2,3};
  

numList指向1.

如果要将此数组的指针传递给类似

的函数
void sort(int *array)
{
//do something
}

您可以使用数组的名称作为参数调用此函数。

sort(numList);

答案 3 :(得分:-1)

int (*numList)[3];

FYG,这是一个指向3个整数数组的指针(方括号的优先级高于*);你不能这样初始化它。