簡體   English   中英

關於 C 中 const char * 聲明的混淆

[英]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.

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