對使用字元指標變數和字元陣列的討論

2022-04-01 06:17:29 字數 2090 閱讀 4719

區別:1、字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址(字串第乙個字元的位址)。

2、賦值方式。對字元陣列只能對各個元素賦值,不能用以下方法對字元陣列賦值:char str[20]; str="i love china";而對字元指標變數,可以用如下方法賦值:char *a; a="i love china ";注意,賦值給a的不是字元,而是字串的第乙個元素的位址。

3、對字元指標變數賦初值:char *a="i love china";等價於char*a; a="i love china";而對陣列的初始化:char a[20]=;不能等價於:char str[20];str="i love china";

4、如果定義了乙個字元陣列,在編譯時為它們分配記憶體單元,它有確定的位址。而定義乙個字元指標變數時,給指標變數分配記憶體單元,在其中可放乙個字元指標變數的位址。也就是說,該指標變數可以指向乙個字元型資料,但若未對它賦予乙個位址值,則它未具體指向乙個確定的字元資料。例:char str[10];  sanf("%s",str); 合法。但:char *a; scanf("%s",a);  有時也可執行,但風險較大。

5、指標變數的值是可以改變的,例:

#include #include

void

main()

6、若定義了乙個指標變數,並使它指向乙個字串,就可以用下標形式引用指標變數所指的字串中的字元。

例:

1 #include 2 #include3

4void

main()

511 }

7、在記憶體中的儲存位置不同。

例:

#include #include

void

main()

void copy_string(char*from,char*to)

*to='\0'

;}

會出錯,

程式中的」i love china」字串在常量區,而使用指標存放字串,b中只是存放了字串在常量區中的位址,當呼叫copy_string函式的時候又引用了b這個引數,即試圖將字串」i am a teacher.」寫入常量區。而常量區的這段記憶體是不可寫的,所以在執行的時候出現了報錯。

對這段**的改進只許把b改為用陣列來存放字串(對a不必修改,因為程式中沒有執行對a寫入的操作)。

char *b = "you are a student.";

改為char b = "you are a student.";

一般認為在c中分為這幾個儲存區:

1. 棧 --有編譯器自動分配釋放

2. 堆 -- 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**

3. 全域性區(靜態區) -- 全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束釋放。

4. 另外還有乙個專門放常量的地方。程式結束釋放

在函式體中定義的變數通常是在棧上,用malloc, calloc, realloc等分配記憶體的函式分配得到的就是在堆上。在所有函式體外定義的是全域性量,加了static修飾符後不管在**都存放在全域性區(靜態區),在所有函式體外定義的static變數表示在該檔案中有效,不能extern到別的檔案用,在函式體內定義的static表示只在該函式體內有效。另外,函式中的"adgfdf"這樣的字串存放在常量區。

比如:

1

int a = 0; //

全域性初始化區

2char *p1; //

全域性未初始化區

3 main()

還有就是函式呼叫時會在棧上有一系列的保留現場及傳遞引數的操作。

棧的空間大小有限定,vc的預設是2m。棧不夠用的情況一般是程式中分配了大量陣列和遞迴函式層次太深。有一點必須知道,當乙個函式呼叫完返回後它會釋放該函式中所有的棧空間。棧是由編譯器自動管理的,不用你操心。

堆是動態分配記憶體的,並且你可以分配使用很大的記憶體。但是用不好會產生記憶體洩漏。並且頻繁地malloc和free會產生記憶體碎片(有點類似磁碟碎片),因為c分配動態記憶體時是尋找匹配的記憶體的。而用棧則不會產生碎片。

在棧上訪問資料比通過指標在堆上訪問資料快些。

指標系統學習5 對使用字元指標變數和字元陣列的討論

雖然用字元陣列和字元指標變數都能實現字串的儲存和運算,但它們二者之間是有區別的,不應混為一談 主要概括起來有以下幾點 1.字元陣列由若干個元素組成,每個元素中 放乙個字元,而字元指標變數中存放的是位址 字串第1個字元的位址 決不是將字串放到字元指標變數中。2.賦值方式。對字元陣列只能對各個元素賦值,...

使用字串指標變數與字元陣列的區別

用字元陣列和字元指標變數都可以實現字串的儲存和運算,但是兩者是有區別的。在使用時,應注意以下幾個問題 1 字串指正變數本身是乙個變數,用於存放字串的首位址。而字串本身是存放在該首位址的一塊連續的記憶體空間中並以 0 作為字串的結束。字元陣列是由若干個陣列元素組成的,它可用來存放整個字串。2 賦值方式...

字元指標變數和字元陣列的對比

使用字元陣列和指標變數都能實現字串的儲存和運算,但它們兩者之間是有區別的,不應混為一談,主要有一下幾點 1 字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址 字串中第乙個字元的位址 絕不是將字串放到字元指標變數中。2 賦值方式。可以對字元指標變數賦值,但不能對陣列名賦值。...