簡體   English   中英

這4項之間有什么區別:字符,數組,字符串,文字。 在C?

[英]what's the difference between these 4 item:character,array,string,literal. in C?

最近在閱讀C書時,我感到很困惑。

它說:指向字符串文字的變量不能用於更改字符串的內容。

據我所知,還有字符文字整數字面 ,他們的情況如何? 他們也無法更新嗎? 如果是這樣,你能舉個例子嗎?

另外, 文字數組有什么區別? 字符數組字符串文字 ,它們實際上是一回事嗎?

我該怎么稱呼下面的變量? 整數數組 整數字面量

int contestants[] = {1, 2, 3};

我已經總結了一些例子,但我仍然有點混亂:

char s[] = "How big is it?";  //s is an array variable

char *t = s;  //t is a pointer variable to a string literal "How big is it?"

字符串文字:“ABC”

字符文字:'a'

整數字面數:1

我被這4個項目搞亂了: 字符,數組,字符串,文字 我還是很亂。

字符數組字符串文字同樣的事情?

一個字符 數組數組文字相同?

文字是程序文本中表示值的標記。 有像"123"這樣的字符串文字,像'a'這樣'a'字符文字和像7這樣的數字文字。

int contestants[] = {1, 2, 3};

在上面的程序片段中,有三個文字1 23 ,沒有其他文字。 特別是, contestants{1, 2, 3}都不是文字。

值得注意的是,C標准僅在引用字符串文字時使用單詞literal。 其他種類正式稱為常數。 但是你可能會發現它們在所有類型的地方被稱為文字,所以我把它們包含在這里。 “整數文字”和“整數常數”是一回事。

字符串文字也是程序中的對象(一段數據,一個存儲區域),該對象與先前意義上的字符串文字相關聯。 這段數據是一個字符數組。 並非每個字符數組都是字符串文字。 沒有int數組是文字。

指針可以指向字符串文字,但不能指向字符文字或整數文字,因為后兩種不是對象(沒有與之關聯的存儲)。 指針只能指向一個對象。 你不能將一個pounter指向一個字面5.所以不會出現這些事情是否可以修改的問題。

char* p = "123";

在上面的程序片段中, "123"是文字, p指向它。 您無法修改p指向的對象。

char a[] = "123";

在上面的程序片段中, a是一個字符數組。 它用字符串文字“123”初始化,但它本身不是文字,可以自由修改。

int i = 5;

以上, 5是文字而i不是。 i用文字初始化,但它本身不是一個。

int k[] = {1, 2, 3};
int* kp = k;

在上面的行中,與前面的行非常相似,數組k及其元素都不是文字。 它們只是用文字初始化。 kp是一個指向數組第一個元素的指針。 可以使用thos指針更新數組; kp[1] = 3;

對於int contestants[] = {1, 2, 3};

contestants是3項類型的陣列int由3個文本進行初始化的123

因此,文字是在代碼中編寫的特定值,您不應混合術語文字(某種類型的值)和數組(也有類型,但是數據結構)。

關於你的字符串示例

char s[] = "How big is it?";  //array variable
char *t = s;  //pointer variable to a string literal

我明白t作為指針數組的第一元素,將其用字符串文字初始化。

首先,讓我們看一些定義。

  • 排列

數組是一種有序數據結構,由一組元素(值或變量)組成,每個元素由一個(單維數組或向量)或多個索引標識。 元素存儲在連續的存儲位置。

  • 字符串文字[來自C11標准,第6.4.5章]

字符串文字是用雙引號括起來的零個或多個多字節字符的序列,如"xyz"

  • 整數常數[來自C11標准,第6.4.4.1章]

整數常量以數字開頭,但沒有句點或指數部分。 它可能有一個指定其基數的前綴和一個指定其類型的后綴。

所以, int x = 5; 這里5是整數常數。

  • 字符常數[來自C11標准,第6.4.4.4章]

整數字符常量是用單引號括起來的一個或多個多字節字符的序列,如'x'

所以, char y = 'S'; ,這里'S'是一個字符常數。


現在,

  1. int contestants[] = {1, 2, 3};

這里的contestants是一個整數數組。

  1. char s[] = "How big is it?";

s是一個字符數組,以null結尾,也可以稱為字符串 OTOH, "How big is it?" 是一個未命名的字符串文字。 我們正在使用字符串文字初始化 s的含義。 s目前在讀寫存儲器中,它的含量是可修改的。

  1. char * point = "Hello World";

p是指向字符串文字"Hello World"的指針。 通常它存儲在只讀存儲器位置,不允許進行更改。

字符串:

char s[] = "How big is it?"; //array variable

這里的s是一個數組並且持有字符串並且具有讀取和寫入選項。您可以修改數組的值。字符串文字的大小“它有多大?” 計算並根據字符串長度計算數組大小。

什么是字符串文字?

char *p = "someString";

這里字符串someString存儲在只讀位置,位置地址返回到指針。 所以現在你不能寫指針所指向的位置。

整數:

int a[] = {1,2,3};

a是一個保存值的數組,它們也可以被修改。

在代碼中

int i;
for(i=0;i<10;i++)

10是整數文字,因為我們看到10表示十進制值並且直接包含在代碼中。

還有一個例子

int b;
b=1;

現在1是整數字面值。

文字是一種直接表示編程語言中的值的語法形式。 因此, 1 + 64是一個表達式,其計算結果為65,而不是文字; xint x = 65還計算為65,但不是字面。 65是表示65的文字, 0x41是相同的; 65L也是表示65的“長整數”版本的文字。 'A'是另一個也代表數字65文字,這次是作為char "ABC"是一個字符串文字,當放入代碼時,代表一個四元素的字符數組,並用值65,66,67和0填充它。 你也可以使用數組文字 (char[]){ 65, 66, 67, 0 } ,它代表相同的值,因為字符串是字符數組。 [看評論]

同時,數組是一個可以包含多個值的數據結構,每個值都由一個整數索引。 數組可以有文字語法( 如上所示, 例如在JavaScript中),文字可以是數組; 但這兩個是蘋果和橘子。

tl; dr:數組是一種特定的數據結構; literal是你在代碼中編寫數據的方式。

暫無
暫無

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

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