![](/img/trans.png)
[英]difference between character array initialized with string literal and one using strcpy
[英]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
2
和3
,沒有其他文字。 特別是, 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個文本進行初始化的1
, 2
和3
。
因此,文字是在代碼中編寫的特定值,您不應混合術語文字(某種類型的值)和數組(也有類型,但是數據結構)。
關於你的字符串示例
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'
是一個字符常數。
現在,
int contestants[] = {1, 2, 3};
這里的contestants
是一個整數數組。
char s[] = "How big is it?";
s
是一個字符數組,以null結尾,也可以稱為字符串 。 OTOH, "How big is it?"
是一個未命名的字符串文字。 我們正在使用字符串文字初始化 s
的含義。 s
目前在讀寫存儲器中,它的含量是可修改的。
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,而不是文字; x
后int 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.