[英]Confusion about const char * declarations in C
我知道這可能看起來像一個愚蠢的問題,但我真的很難理解 C 代碼的一些特定示例,這些示例涉及const char *
類型的聲明。
讓我想到它的例子是在Parsing csv with c的答案中。 特別是,function 定義為:
const char* getfield(char* line, int num)
{
const char* tok;
for (tok = strtok(line, ";");
tok && *tok;
tok = strtok(NULL, ";\n"))
{
if (!--num)
return tok;
}
return NULL;
}
我對const char *
聲明的理解是它定義了一個指向不可變字符數組的可變指針。 該數組在編譯時分配在數據段中。 但是在這種情況下(以及許多其他代碼示例), const char *
聲明不適用於字符串文字。 如果在 function 執行之前不知道字符串的實際值,那么如何在編譯時為此分配 memory?
這個
const char* tok;
在堆棧上創建一個指針。 它有一個未定義的值,它指向任何地方
這個
for (tok = strtok(line, ";");
然后讓它指向line
中的某個地方(取決於內容)
你的評論
我對 const char * 聲明的理解是它定義了一個指向不可變字符數組的可變指針。 該數組在編譯時分配在數據段中。
第一句話,幾乎,它創建了一個指針,該指針可能指向一個不可變的字符數組。 像這樣
const char * msg = "hello world";
但也無處可去
const char * msg = NULL;
或者一個可變的字符數組
char msg[] = "HelloWorld"; // mutable
const char *msgconst = msg;
第二句
這個數組在編譯時賦值在數據段
是的,如果這是一個文字。 我又喜歡這個例子
const char*msg = "Hello World";
但是msgconst
賦值不是這樣的,字符在棧上
希望這可以幫助
編輯
指針指向它被告知要做的事情,使其成為常量或不常量對數據的位置影響為零。 數據就在哪兒。(.),你要考慮數據是從哪里創建的,跟指針無關,指針可以指向一個字面量,棧數據,static數據(數據段可變)。 堆。
為什么要使用常量
如果字符串是不可變的,那么指針必須是常量。 由於歷史原因,C 允許您將文字分配給非常量指針,c++ 則不允許
您要明確表示不應更改此字符串。 在您的代碼案例中,您真的不應該弄亂 strtok 正在處理的字符串。 雖然它返回 char*,但這是一個很好的做法
像 strlen 這樣不改變傳遞給它們的字符串的函數將它們的 arguments 聲明為 const char*,這是它們合同的一部分:我們不改變字符串
但是使用const
這個詞不會改變存儲的任何內容,也不會在任何地方節省任何空間
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.