字元陣列 字元指標請不要再糾結

2022-09-23 12:03:10 字數 2086 閱讀 6944

在c語言中字元陣列、字元指標的一些特質感覺有點模糊,有些時候只知道要這樣做卻不知道為什麼,過段時間就忘了,下次又得費時費力費錢的找答案,難受。ok,今天就好好琢磨琢磨~

先來兩個基本概念:

1、宣告字元陣列

int a[10];定義了乙個長度為10的陣列a。換句話說它定義了乙個由10個物件組成的集合,這10個物件儲存在相鄰的記憶體區域中,名字分別為a[0]、a[1]、...如果pa的宣告為int *pa;則說明它是乙個指向整形物件的指標,那麼賦值語句pa = &a[0];則可以將指標pa指向陣列a的第 0 個元素,也就是說pa的值為陣列元素a[0]的位址。這樣,賦值語句x = *pa;將把陣列元素a[0]中的內容複製到變數 x 中。

那麼,根據指標運算的定義,pa+1將指向下乙個元素,pa+i將指向pa所指向陣列元素之後的第i個元素。無論陣列a中元素的型別或陣列長度是什麼,上面結論都成立。指標加 1 意味著指向下乙個物件。

所以,pa = &a[0] 也可以寫成下列形式:

pa = a;綜上:&a[i] 和 a+i 的含義是相同的。相應地,如果 pa 是個指標,那麼在它的表示式中也可以加下標(是的,你沒有看錯)char a[100];

char *b = null;

memset(a, 0, sizeof(a));

a[0] = '0';

a[1] = '1';

a[2] = '2';

b = a;

char test= b[1]; //現在test的值就是 1

但是有一點必須記住,陣列名和指標之間的乙個不同之處:指標是乙個變數,因此,在c語言中,語句pa = a 和 pa++ 都是合法的。但是陣列名不是變數,因此,類似於a = pa 和 a++形式的語句是非法的。

2、關於字元指標

char *a = test;這裡的指標a是乙個變數,它指向靜態常量區的test的首位址,並且常規狀態下「test」不可改變(當然,通過某些手段也是可以改變的)。

有了以上兩點,下面繼續...

1、字元陣列轉字元指標

有時候需要在字元陣列和字元指標之間相互轉換,不可避免的用到strcpy()函式,先看看它的原始碼:

void strcpy(char *s, char *t)

再來看個超簡單的例子:char *a = null;

char b[5]= ;

a = b; //ok,這樣正確

strcpy(a,b); //這樣會報記憶體錯最開始,指標變數指向null,a在記憶體中是沒有分配空間的,a = b 的時候,指標變數a指向了陣列的首元素位址也就是 '1' 。但strcpy的時候,*s 是無法被賦值的,因為沒有為它開闢記憶體空間。有人會問,開闢記憶體空間是吧,那行,我這樣 char *a = abc; 現在*a 有記憶體空間了吧!試了發現仍然不行,因為 *a 現在是不可改變的,強行賦值當然出錯。如果非要用strcpy也行,那得重新開闢記憶體給 a。char *a = (char *)malloc(100); //大小自己看情況定吧

char b[5] = ;

strcpy(a,b); //這樣就沒問題了這兩種方式的區別就是:

直接賦值時,改變的僅僅是指標的指向,即a指向了陣列b。

使用函式strcpy時,在記憶體中多開闢了一塊空間,也就是說現在記憶體中有兩塊內容一樣空間,都為,一塊由a指向,一塊由b指向。

2、字元指標轉字元陣列

char *a = 123;

char b[5];

memset(b,0,sizeof(b));

b = a; //會報錯

strcpy(b,a); //ok

前面說了,陣列名不是變數,不能當左值,顯然 b = a 會報錯。

strcpy裡面的兩個引數傳給char * 一點問題都沒有,s指向b 的首位址,t指向常量區的'1'。

字元陣列單個元素的值是可以改變的。這裡要說一下的是字元陣列初始化的問題,一般三種情況:

1、定義的時候直接用字串賦值

char a[10]=hello;

注意:不能先定義再給它賦值

2、對陣列中字元逐個賦值

char a[10]=;

3、利用strcpy

字元,字元陣列,字元指標

一 字串變數與常量 例 char a abcdefg 這一段語句中,既有字串變數,也有字串常量。變數是陣列a,常量是 中的字面量字串 abcdefg 此時,可以訪問或修改a中任意乙個元素 但是,常量字串只能訪問,不能修改。這句留著下面有用 二 字元指標與字串常量 例 char p abcdefg 這...

字元陣列VS字元指標

1.以字串形式出現的,編譯器都會為該字串自動新增乙個 0作為結束符,如在 中寫 abc 那麼編譯器幫你儲存的是 abc 0 2.abc 是常量嗎?答案是有時是,有時不是。不是常量的情況 abc 作為字元陣列初始值的時候就不是,如 char str abc 因為定義的是乙個字元陣列,所以就相當於定義了...

字元陣列VS字元指標

1.以字串形式出現的,編譯器都會為該字串自動新增乙個 0作為結束符,如在 中寫 abc 那麼編譯器幫你儲存的是 abc 0 2.abc 是常量嗎?答案是有時是,有時不是。不是常量的情況 abc 作為字元陣列初始值的時候就不是,如 char str abc 因為定義的是乙個字元陣列,所以就相當於定義了...