我一直在看一個源代碼,我遇到了這段代碼
static char const *const delimit_method_string[] =
{
"none", "prepend", "separate", NULL
};
我以為我知道C語言中const關鍵字的含義,但看到這個語法后我很困惑,因為我無法解碼語法的含義,所以我想知道這樣使用的含義我在網上搜索我看到了一些問題像這樣在stackoverflow中,const
- C/C 簽名中兩個const的含義
- 雙常量宣告
但是我仍然不明白該代碼片段中語法的含義是什么,可能是因為我對C 的基礎知識還不夠好,但我真的很想改進它。
所以我寫了一些代碼來了解該語法是如何作業的,這是我嘗試過的:
#include <stdio.h>
int main()
{
char a = 'A';
char b = 'B';
char const * const ptr = &a;
ptr = &b;
printf("a is %c\n", *ptr);
printf("a is %c", a);
return 0;
}
我得到了這個輸出,有點我的預期。
$ gcc test.c
test.c: In function 'main':
test.c:9:13: error: assignment of read-only variable 'ptr'
9 | ptr = &b;
|
^
我改了代碼又測驗了
#include <stdio.h>
int main()
{
char a = 'A';
char b = 'B';
char const const *ptr = &a;
ptr = &b;
printf("a is %c\n", *ptr);
printf("a is %c", a);
return 0;
}
這次的輸出不是我所期望的,
$ ./a.exe
a is B
a is A
如果有人能解釋const在C中使用的正確方法是什么,以及第一個代碼片段中的語法是如何作業的,我真的很感激。
uj5u.com熱心網友回復:
本宣告
static char const *const delimit_method_string[] =
{
"none", "prepend", "separate", NULL
};
宣告一個帶有delimit_method_string指向字串文字的指標名稱的陣列。
在與 C 相對的 C 中,字串文字具有非常量字符陣列的型別。盡管如此,您可能無法更改字串文字。任何更改字串文字的嘗試都會導致未定義的行為。因此,最好以如下方式宣告指向字串文字的指標,例如
const char *s = "Hello";
所以你可以像這樣宣告上面的陣列
static char const * delimit_method_string[] =
{
"none", "prepend", "separate", NULL
};
但是宣告這個陣列的程式員也想把 at 宣告為一個常量陣列。那就是他想讓它的元素無法改變。
對于上面的宣告,您可以撰寫例如
delimit_method_string[0] = "all";
為了防止這種變化,陣列的元素必須是常量。要做到這一點,你需要寫
static char const * const delimit_method_string[] =
{
"none", "prepend", "separate", NULL
};
現在,const char *由于第二個限定符 const ,具有指標型別的陣列元素是常量。
湯姆更清楚地考慮以下宣告。
char *p;
此宣告宣告了一個非常量指標,指向型別為 的非常量物件char。
const char *p;
此宣告宣告了一個指向型別為 的常量物件的非常量指標char。
const char * const p;
這個宣告宣告了一個指向型別的常量物件的常量指標char。
最后一個宣告可以像這樣重寫
const char ( * const p );
至于這個你的宣告
char const const *ptr = &a;
那么這兩個限定符中的 onconst是多余的,因為兩者都指代型別說明符char。
uj5u.com熱心網友回復:
char const const *ptr = &a;
這個 doubleconst沒有任何特殊含義,因為它們都在*. const編譯器會忽略其他限定符。你可以寫char const const const const const*ptr = &a;和 char const *ptr = &a; 一樣 意思是:
pointer to constant character
如果我們把它改成
char const * const ptr = &a;
這將意味著:
constant pointer to constant char
您的代碼段將停止編譯:https : //godbolt.org/z/sM9qnv8fq
例子:
const int *ptr;- 指向常量整數的指標int * const ptr;- 指向整數的常量指標const int * const ptr;- 指向常量整數的常量指標
您的第一個示例static char const *const delimit_method_string[]宣告:
static array of constant pointers to constant character
順便說一句,我個人更喜歡在型別之前使用第一個常量,即:
static const volatile char *const delimit_method_string[]
const char *p
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367403.html
