[英]C existing pointer to fixed-size array
假設任何C函數都有一個已聲明但尚未分配任何值的指針。 我們將以我們的例子為例。
int *ptr;
該函數的目標是不給ptr
分配堆上的任何動態內存,因此沒有malloc
調用。 相反,我們希望它指向固定大小n
的數組。 我知道我可以這樣實現:
int arr[n];
ptr = arr;
但是,如果我們需要在函數中進行多次操作,則代碼可能會變得非常混亂且難以閱讀,即,許多指針字段的結構都需要指向固定長度的數組。 有沒有更好的方法可以一站式完成? 我在想類似下面的內容,但看起來太含糊且無法編譯:
int *ptr;
// Many other things happen in between...
ptr[n];
***編輯***
在這里,下面的其他信息可能有助於指導更多答案(不是說當前答案不正確)。 在我的用例中,指針在結構中聲明,並且在函數中,我將指針分配給數組。 我想知道是否有比下面的代碼(所有指向固定長度數組的指針)更簡單的方法來實現此目的:
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;
...
}
您不能在單個聲明中聲明數組並將其分配給現有指針。 但是,您可以將數組指針分配給新聲明的指針,如下所示:
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;
...
}
這似乎很明顯,您需要進行一些重構。 采取類似的語句,將它們提取到新函數中 (通過傳遞對struct和您希望struct字段指向的數據的引用),並為該新函數賦予一個有意義的名稱。
這可能比您在幾周或幾個月內會忘記的一些花哨的指針算術快捷方式更易於維護和更具可讀性。
在您的示例中, ptr
和arr
之間的區別是可以更改ptr
的值。 所以我想您想在整個數組中移動ptr
。
那么呢:
int arr[n], id=0;
然后您更改id
的值並將arr+id
用作ptr
。
我想做到這一點的方法是使用宏。 有點像(未經測試)
#define autoptr(name,size) int Arrayname[size]; name = Arrayname;
我不清楚為什么這會幫助我認為它可能看起來“難看”,但是如果沒有宏,將更易於維護。 通常,隱藏您的實際工作是一件壞事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.