簡體   English   中英

如何在C中定義數組類型並使其成為const指針(而不是指向const的指針)

[英]How to define array type in C and making it a const pointer (not pointer to const)

我知道我可以在C中定義數組類型,如下所示:

typedef int array_t[123];

但是,這沒有聲明

void someFunction(array_t myArray)

在某種意義上說是恆定的

myArray=0;

在函數內部是被禁止的,但是

myArray[0]=0;

被允許。

有沒有辦法做到這一點? 如果在類型定義或參數聲明中添加“ const”,則最終會出現相反的行為,即數組元素為常量,但數組指針本身為變量。

無論如何,您永遠都不能分配給數組變量。 雖然數組會衰減到指針,但只要它沒有衰減,它就不會指向指針,因此您無法為其賦值。

如果要將所有數組設置為特定值,請使用memset ,或者如果要復制另一個數組,請使用memcpy


編輯后。 這里要記住的重要一點是,如果將其作為參數傳遞,那么它將作為指針而不是數組傳遞。

您可以做的是將參數聲明為常量指針,而不是指向常量的指針。

喜歡

void someFunction(int * const myArray);

然后,您仍然可以修改元素,但是不能更改實際的指針。

C99確實引入了用於通過“數組”語法聲明常量指針參數的語法

void foo(int a[const 123]) /* same as `int *const a` */
{
  a = NULL; // ERROR
}

如上例所示,必須將const放在[]

但是,不能通過對數組類型使用typedef聲明將該const提前嵌入到數組類型中。 它只能直接在功能參數列表中使用。

如果您絕對需要typedef ,請使用struct對其進行封裝。 在數組上使用typedef不是一個好主意。

typedef struct {
    int arr[123];
} array_t;

然后您可以使用const來執行Joachim Pileborg的建議:

void someFunction(array_t * const myArray)
{
    myArray->arr[0] = ...

這種方法的另一個優點是,您還可以與對象一起傳輸其他數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM