簡體   English   中英

在C中將字符串分配給字符指針的說明

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

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