簡體   English   中英

C字符串和char數組聲明

[英]C string and char array declarations

鑒於這些是允許的:

char c[] = "abc";
char c[] = {'a','b','c','\0'}
char *c = "abc";

那為什么不允許這樣做?

char *c = {'a','b','c','\0'};  // error: a char cannot initialize a char*

如果編譯器將字符串文字解釋為以null終止的char數組,那么我會認為它等同於上面的語句3,不是嗎?

同樣,為什么不允許這樣做:

int arr[3];
int *i = arr; // OK
int *i = {1,2,3} // error: an int cannot initialize an int*

這不是一個大問題,我很好奇。我想這個問題歸結為一個字符串常量(或聲明的整數數組)和一個字符元素數組在分配給指針時的區別是什么?

數組不是指針。 用字符串文字初始化字符數組是一種特殊情況(6.7.8#14):

字符類型的數組可以由字符串文字初始化,並可選地用大括號括起來。 字符串文字的連續字符(如果有空間或數組大小未知,則包括終止空字符)將初始化數組的元素。

並且(6.7.8#16):

否則,具有聚合或聯合類型的對象的初始化程序應為括號內的元素或命名成員的初始化程序列表。

關於指針初始化(6.7.8#11):

標量的初始化程序應為單個表達式,可以選擇用大括號括起來。 對象的初始值是表達式的初始值(轉換后); 采用與簡單賦值相同的類型約束和轉換,將標量的類型作為其聲明類型的非限定版本。

數組不是指針。 只是數組名稱是指向第一個數組項的指針。

您在這里要問的是在C / C ++中初始化數組的不同方法。 請注意:

  1. 只能在聲明行上初始化數組
  2. C / C ++中沒有字符串類型
  3. 字符數組在C / C ++中用作字符串。
  4. 字符數組的初始化與其他數組的規則相同。
  5. 如果我們定義一個沒有顯式長度的數組,則它將以初始值個數的長度來定義。
  6. 如果您不定義初始值,則這些項目將是未定義的。 這意味着數組項的值最初不清楚。
  7. 如果您有一個數組並將初始值分配給某些新項目的第1個,則剩余項目將為0。
  8. 我將在以后完成此列表;-)

字符串文字是section DATA中未命名數據的特例。 使用數組時,您應該手動分配堆上的空間,然后將數據移到那里。 (因為不能分配數組,所以是一對一的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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