假设任何C函数都已经声明了一个指针,但还没有赋值。我们将int为我们的例子。
int *ptr;
该函数的目标不是在堆上分配ptr
任何动态内存,因此不会调用malloc
。相反,我们希望它指向一个固定大小n
的数组。我知道我可以这样做:
int arr[n];
ptr = arr;
然而,如果我们需要在函数中多次执行此操作,代码可能会非常混乱并且难以阅读,即,许多指针字段的结构都需要指向固定长度的数组。有没有更好的方法来实现这一目标?我在考虑类似于下面的内容,但它看起来太模糊和不可编辑:
int *ptr;
// Many other things happen in between...
ptr[n];
*** *** EDIT
在这里,以下附加信息可能有助于指导更多答案(并不是说目前的答案不是很好)。在我的用例中,指针在结构中声明,在函数中,我将指针指向数组。我想知道是否有一种更简单的方法来实现这一点,而不是下面的代码(指向固定长度数组的所有指针):
struct foo {
int* a;
short* b;
char* c;
...
};
void func(void) {
struct foo f;
int n = ...;
int tempArr1[n];
f.a = tempArr1;
short tempArr2[n];
f.b = tempArr2;
char tempArr3[n];
f.c = tempArr3;
...
}
答案 0 :(得分:1)
您无法声明数组并将其分配给单个声明中的现有指针。但是,您可以将数组指针分配给新声明的指针,如下所示:
int arr[n], *ptr = arr;
如果你坚持留在一行,你可以使用一个丑陋的宏,如下:
#define DECL_ASSIGN_INT_ARRAY(name,size,pointer) int name[(size)]; pointer = name;
这个单行的清晰度远低于你帖子中的两行版本,所以我会保留你的初始版本。
编辑(响应问题编辑)
另一种选择是在声明中创建一个未使用的指针变量,并将指针分配给初始化器,如下所示:
void func(void) {
struct foo f;
int n = ...;
int tempArr1[n], *tempPtr1 = f.a = tempArr1;
short tempArr2[n], *tempPtr2 = f.b = tempArr2;
char tempArr3[n], *tempPtr3 = f.c = tempArr3;
...
}
答案 1 :(得分:0)
这似乎是一个明显的案例,你需要进行一些重构。使用类似的语句extract them into a new function(通过传递对结构的引用和希望struct字段指向的数据)并为这个新函数赋予一个有意义的名称。
这可能比你在几周或几个月内忘记的一些奇特的指针算术快捷方式更易于维护和读取。
答案 2 :(得分:0)
您的示例中ptr
和arr
之间的区别是您可以更改ptr
的值。所以我想你想把ptr
移到数组中。
那怎么样:
int arr[n], id=0;
您更改id
的值并使用arr+id
作为ptr
。
答案 3 :(得分:0)
我想这样做的方法是使用宏。像(未经测试的)
之类的东西 #define autoptr(name,size) int Arrayname[size]; name = Arrayname;
我不清楚为什么这有助于我认为它可能“看起来很难看”,但如果没有宏,它将更容易维护。一般来说,隐藏你实际做的事情是件坏事。