[英]Explanation for assigning a string to a character pointer in C
我對指針非常困惑。 如果我們創建一個'char'類型的指針變量,那就像char *ch;
並為其分配一個字符數組。 然后,我們可以通過增加指針(++ ch)來訪問字符串中的每個字母。
char *ch;
char a[5]="hello";
*ch=a;
while(*ch) {
printf("%c",*ch);
++ch;
}
這工作得很好。 但是我看到很多例子,
struct example {
char *ch;
};
int main() {
struct example ex={"hello"};
printf("%s",ex.ch);
}
我對這個示例非常困惑,例如如何直接將字符串分配給字符指針(而不是將字符串分配給變量,然后將其分配給字符指針)如何使其可訪問。 在前一種情況下,* ch指向數組“ a”的起始存儲器。 但是在第二種情況下,指針ch指向哪個內存? 誰能給我清楚的解釋?
進行此作業時
ch=a;
您正在將指針ch
設置為字符數組a[]
的開頭(請注意:數組保持為空終止的事實純屬巧合-您的代碼具有未定義的行為,因為結尾處的第六個字符'\\0'
"hello"
的副本不會復制到5個字符的數組中)。 賦值ch
成為存儲在數組a[]
的C字符串的“別名”之后,這意味着您可以將其與字符串操作和格式化例程一起使用。
您的第二個示例不是賦值,而是初始化:
struct example ex={"hello"};
花括號中包含一個初始化程序。 C編譯器將采用每個元素(只有一個,但是可以有很多),並將其分配給struct
的相應字段。 在這種情況下,字符串文字"hello"
被分配給ch
成員。
初始化程序的規則是按聲明順序在大括號中分配值。 如果願意,可以使用C99的指定初始化器功能覆蓋它:
struct example ex={ .ch = "hello"};
此代碼段
char *ch;
char a[5]="hello";
*ch=a;
while(*ch)
{
printf("%c",*ch);
++ch;
}
具有不確定的行為。 它將正常工作,您必須將字符數組聲明為
char a[6]="hello";
或char a [] =“ hello”;
在這種情況下,數組確實將具有終止的零。
至於此代碼段
struct example
{
char *ch;
};
int main()
{
struct example ex={"hello"};
printf("%s",ex.ch);
}
然后在這句話
struct example ex={"hello"};
編譯器首先將字符串文字“ hello”作為具有char[6]
類型的字符數組放置在內存中,然后將指向數組第一個元素的指針分配給結構的數據成員ch。
這兩個聲明之間的區別
char ch[] = "hello";
和
char *ch = "hello";
是在第一種情況下,創建了一個字符數組,其每個元素都由字符串文字的相應字符初始化,該字符串本身不會存儲在內存中。 在第二種情況下,字符串文字將存儲在內存中,指針ch將包含其第一個字符的地址。
char a[] = "hi";
char *ch = "hello";
這里a
是一個大小為3個字節的char數組,用於存儲' h
',' i
'和' \\0
'。 該內存的3個字節在堆棧中分配,以保留字符串。
此處ch
是一個指針變量,它存儲一個char地址,而ch
大小是4個字節來存儲該地址(指針的大小是編譯器特定的)。 然后“ hello
”是一個常量字符串文字,它將作為只讀數據出現在過程存儲器的文本段中。 並且第一個字節的地址分配給ch
變量。 為ch
變量分配了4個字節的內存以將地址存儲在堆棧中,並且在文本段中需要5個字節的內存以保持字符串文字“ hello
”。
有關其他觀點的解釋,請閱讀此處 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.