我有一个需要保存指向数组的指针的变量。 通常,这是通过首先使用数组创建变量,然后将指针保存到该变量来完成的。但是,我需要对10个变量执行此操作,并且我不想为每个变量创建额外的数组。 我最初尝试的是
int *numList = {1, 2, 3};
但是这会尝试创建一个指向整数的指针数组。我认为以下列表的类型正确,但我不知道如何将数组转换为指针。
int (*numList)[3] = {1, 2, 3};
答案 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个整数数组的指针(方括号的优先级高于*);你不能这样初始化它。