c語言指標與字元陣列

2021-10-19 23:02:35 字數 3562 閱讀 3511

歡迎關注awp資訊

我們所說的字串就是字元陣列的一種,就如我們常見的"hello world!",字串的使用在c語言中也是非常重要的,常常會遇到一些操作,如字串的修改、拷貝、字串長度等,在物聯網的應用中也尤為突出,物聯網應用中所用的模組,大多是需要使用at指令的,這就需要對字串的操作。

在字元陣列或字串的操作中,首先要理解字串在記憶體中的儲存,比如我們有乙個"hello"字串,我們用sizeof計算它的大小,我們可以看到它的大小為6,是6個位元組,明明是5個字元,為什麼是6個位元組呢?我們列印出來看一下

#include

intmain()

我們列印出來的結果是6

明明裡面是5個字元,為什麼使用sizeof出來是6,因為在字串的結尾還有乙個字元』\0』,在字串中預設是以null也就是\0為結尾的,所以這個字串計算出來的大小是6。

定義乙個陣列char a[8];將hello拷貝到這個陣列中,通過記憶體分布的圖示來分析一下

a[0] = 『h』;a[1] = 『e』;a[2] = 『l』;a[3] = 『l』;a[4] = 『o』;a[5] = 『\0』

最後這裡就是以』\0』結尾的,表示這個字串結束了。這是乙個語法規則,必須要記住的。

我們通過一段**來看一下,沒有』\0』結尾的字串,列印出來是什麼樣的

#include

intmain()

這裡列印出來的結果就是陣列定義的大小,並不是6,我在兩個平台下進行驗證結果,在linux中列印出來的結果字串內容正常,在vc++6.0中列印出來的是亂碼,這就說明軟體執行時沒有找到結束符。

我們給這個陣列增加乙個』\0』再來列印看,列印出來的字串就正常了

字串的操作有很多操作函式,比如strlen計算字串長度的,這裡的長度不是計算占用空間的大小,這裡是字串的個數,我們來看一下hello的字串長度

#include

#include

intmain()

列印出來的結果如我們所料,strlen是計算字元陣列中元素個數的,不包含結束符,這個一定要區分開,這也是面試中常見的乙個知識點。

字串的初始化方式有多種,我們上面看到的char c[6] = 「hello」;這是一種,這是隱式的將』\0』新增到字串中,還有一種是這樣char c[6] = ;這是顯示地將結束符定義在陣列中,並且陣列大小要大於或等於大括號中的元素個數,陣列在記憶體中是連續儲存的,它的記憶體分布

c是這個陣列的名稱,陣列元素在記憶體中的分布,第乙個h的位址是100,每個元素佔1個位元組,整個陣列的記憶體位址分布就如上圖所示。

我們定義乙個指標變數char * pc;記憶體示意,通常指標是4個位元組,假設這裡的位址是200

我們接下來寫這樣一段**

char c[6]

=;char

* pc;

pc = c;

pc是指向字元的指標,實際上pc中的值是陣列c的首元素位址100

這樣我們就可以使用pc這個指標變數來運算元組了,比如想要修改陣列的內容可以pc[0] = 『w』,我們列印出c的陣列內容就會改變,這裡的pc是基位址,pc+i就可以指向陣列的對應位址,通過解引用*(pc+i)得到陣列內的具體元素。

這裡我們要注意的是我們不能寫成c = pc,這種是會編譯報錯的,我們同樣不能對陣列進行和指標類似的操作如c = c+1;但是可以對指標進行這種操作,比如pc++,這樣就可以指向陣列的下乙個元素。對應位址變為101

我們通過一段**加深一下,指標和陣列之間的關係應用。

定義乙個陣列,通過呼叫列印函式將陣列中的內容列印出來

#include

void

print

(char

*c)printf

("\n");

}int

main()

列印出來的結果如下,可以看到完整地將hello列印出來

接下來分析一下上面函式,在main函式中定義了字串,我們寫乙個列印函式,將陣列的首位址傳入列印函式,傳入函式的首位址的值就是對應的陣列中的元素,通過判斷是否到最後乙個字元,決定是否結束列印。

我們在列印函式中還可以使用指標的方式來操作,列印函式修改為,我們得到的結果仍然是正確的,傳入陣列的首位址,遍歷陣列中的每個元素的位址,對位址中的值進行解引用,得到最終的字串。

void

print

(char

*c)printf

("\n");

}

我們還有一種寫法

得到的結果同樣是準確無誤的。

我們在討論指標的時候,要清楚指標它在記憶體中的分布,這樣才能更好應用指標的一些操作。

在定義字串的時候,我們使用陣列定義,它是被分配在棧上的

char c[10]

="hello"

;

如果我們使用指標定義字串,它是被分配在常量區的,是不可修改的。

char

*c =

"hello"

;

如果不允許字串修改的話我們可以在print函式中形參中加上const

void

print

(const

char

*c)printf

("\n");

}

C語言 陣列與指標 字元與字串

1 字元與字串 char c a 而不能寫出char c a 字元變數用單引號 而字串用雙引號。2 字元陣列與字元指標的初始化 char s 10 p strcpy s,hello word n 或者p hello word n 而不能用s hello word n y因s陣列名表示陣列的首位址是個...

C語言指標陣列與陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標 指標與陣列

1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...