讓我們通過下面的例子,來了解 C語言中字符數(shù)組和字符指針之間的區(qū)別。
void test() { //arr is array of characters char arr[12] = "Aticleworld"; //ptr is pointer to char char *ptr = "Aticleworld"; }現(xiàn)在,讓我們比較arr(字符數(shù)組)和ptr(字符指針)。
區(qū)別1: 字符串文本是用雙引號括起來的零個或多個多字節(jié)字符的序列。當你編寫語句 char arr[12] = "Aticleworld"時,字符串文本中的字符被復(fù)制到 arr. 當您編寫語句 char *ptr = "Aticleworld"時,您是讓字符串文本數(shù)組進行數(shù)組到指針的轉(zhuǎn)換,以獲取指向其第一個元素的指針。指針 ptr 指向字符串文本數(shù)組的第一個元素 ('A').

區(qū)別2: arr 是存儲在連續(xù)內(nèi)存位置的字符集合,而 ptr 保存字符的地址。
arr 包含 12 個元素,每個元素位于連續(xù)的內(nèi)存位置。另一方面,ptr 保存字符串文本的第一個字符的地址。
區(qū)別3:當我們在 char 數(shù)組 arr 上使用 sizeof 運算符時,它給出字符總數(shù),而 char 指針 ptr 只給出指針的大小。如下:
#includeint main() { //arr is array of characters char arr[] = "Aticleworld"; //ptr is pointer to char char *ptr = "Aticleworld"; printf("Size of arr %ld ", sizeof(arr)); // sizeof a pointer is printed which is same for all type // of pointers (char *, void *, etc) printf("Size of ptr %ld", sizeof(ptr)); return 0; }
輸出
Size of arr 24 Size of ptr 4區(qū)別4: 和指針之間的另一個重要區(qū)別是,我們可以增加指針,但不能創(chuàng)建數(shù)組的增量。例
arr++ =>非法語句。 ptr++==>正常語句。區(qū)別5:我們可以將值重新分配給數(shù)組,但字符串文本不可修改。如果程序嘗試修改由字符串文本形成的靜態(tài)數(shù)組,則行為未定義。例
//arr is array of characters char arr[] = "Aticleworld"; gets(arr); fgets(arr,sizeof(arr),stdin); //有效表達式 scanf("%s", arr); //有效表達式 strcpy(arr, "aticle"); //有效表達式 arr[0] = 'a'; //有效表達式 arr[10] = 'M'; //有效表達式 arr[11] = 'M'; //有效表達式
char *ptr = "Aticleworld"; ptr[0]='P';//無效表達式 *ptr='W';//無效表達式無別6: 未初始化的指針也可能導(dǎo)致未定義的行為。請參閱以下示例。
char *ptr; ptr[0] = 'A'; //未定義的行為 gets(ptr); //未定義的行為 scanf(“%s”, ptr); //未定義的行為 strcpy(ptr, “source”); //未定義的行為 strcat(ptr, “second string”); //未定義的行為區(qū)別7: Char數(shù)組本質(zhì)上是靜態(tài)的,這意味著您無法調(diào)整數(shù)組的大小,而使用指針,您可以在任何時間點更改分配的內(nèi)存的大小。
區(qū)別8:數(shù)組完全由程序控制。它將正確分配所需的內(nèi)存,并在超出范圍時自動釋放內(nèi)存。但是,如果分配動態(tài)內(nèi)存,則char指針的情況有所不同,您必須手動取消分配它,否則會引入內(nèi)存泄漏。例
void foo1()
{
//arr是字符數(shù)組
char arr[12] = "Aticleworld";
}
//Issue memory leak
void foo2()
{
char *ptr = (char*)malloc(12);
//忘記釋放內(nèi)存
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
C語言
+關(guān)注
關(guān)注
183文章
7644瀏覽量
145609 -
字符
+關(guān)注
關(guān)注
0文章
237瀏覽量
26211 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71854 -
數(shù)組
+關(guān)注
關(guān)注
1文章
420瀏覽量
27368 -
char
+關(guān)注
關(guān)注
0文章
11瀏覽量
3926
原文標題:【軟件】C語言中的char數(shù)組和char指針有什么區(qū)別?
文章出處:【微信號:玩轉(zhuǎn)單片機與嵌入式,微信公眾號:玩轉(zhuǎn)單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
C語言數(shù)組和指針的區(qū)別
大家好,我是嵌入式老林,從事嵌入式軟件開發(fā)多年,今天分享的內(nèi)容是C語言數(shù)組和指針的區(qū)別,希望能對你有所幫助。
發(fā)表于 07-11 12:40
?882次閱讀
C語言中指針數(shù)組和數(shù)組指針的區(qū)別
指針和數(shù)組之間存在著緊密的關(guān)系。在本文中,我們將探討指針和數(shù)組的關(guān)系、指針算術(shù)和數(shù)組遍歷、多維
發(fā)表于 08-17 15:29
?904次閱讀
char *和char數(shù)組的區(qū)別及內(nèi)核訪問用戶區(qū)
的也就是兩個指針了,而對于char數(shù)組 pa2,它的內(nèi)存表示就是s1的15個字節(jié)而s2的15個字節(jié)連續(xù)排放,整個結(jié)構(gòu)就是實實在在的數(shù)據(jù),我們傳入send就將s1和s2的內(nèi)容一塊傳送出去 了,而不僅僅
發(fā)表于 04-02 14:36
?3397次閱讀
C語言函數(shù)中的傳值和傳指針到底有什么區(qū)別
我們可能聽過C語言中的傳值和傳指針,在其他語言中,也有傳引用一說,那么他們到底有什么區(qū)別呢?如果
C語言函數(shù)參數(shù)關(guān)于傳值和傳指針有什么區(qū)別?
C語言函數(shù)參數(shù)的傳值和傳指針有什么區(qū)別?
為什么C語言函數(shù)不能返回數(shù)組?
C語言函數(shù)可以返回指針、結(jié)構(gòu)體,為什么不能返回數(shù)組? 下面一步一步來分析: 1 函數(shù)不能返回數(shù)組 在C
MCU_C語言中 數(shù)組型指針 的應(yīng)用 -- char (*stringp)[]
定義一個指向數(shù)組的指針stringpchar (*stringp)[];取得某個數(shù)組的地址 :char *dst = &string[10];
發(fā)表于 11-29 18:06
?2次下載
C語言中什么是指針數(shù)組
在C語言中一個數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,
Char數(shù)組與String是如何從統(tǒng)一走向分離的?
在很多編程語言中,經(jīng)常用 String 類型來表示字符串,用 Char 來表示字符類型;
發(fā)表于 05-19 09:49
?1630次閱讀
指針數(shù)組和二維數(shù)組有沒有區(qū)別
指針數(shù)組和二維數(shù)組有沒有區(qū)別?比如這樣的兩個代碼。 int main(){ char *s1[] = { "hello", "world",
C語言中的char數(shù)組和char指針有什么區(qū)別?
評論