指標,陣列名,字串名《轉》

2021-09-01 09:48:46 字數 2090 閱讀 8269

定義:

char ch[10];

char ch2;

char* str;

"string"。

1.全域性的變數和函式內的static變數,存放在記憶體堆區域。

2.全域性的陣列和函式內定義的static的陣列,存放在記憶體堆區域。

3.區域性變數,陣列,存放在記憶體的棧區域。

4.定義char ch[10]時,如果是全域性或者static的,就在堆區域給他分配10byte的空間,並且如果使用者沒有給它初值,10byte資料全部置零。

5.定義char ch[10]時,如果是區域性陣列(在函式內定義且不是static的),則在棧區域分配10byte的空間,如果使用者沒有給它初值,10byte的資料未知,為記憶體中原來的不確定資料。

6.定義char * str時,給str分配乙個4byte的空間,用於儲存乙個位址。該位址可以指向任意地方。如果沒有給它初值,則其中資料是該片記憶體原來的資料,所以會指向乙個不確定的地方,這時候如果對該指標指向的地方賦值,可能會因破壞未知位址記憶體資料,造成系統崩潰。

7.「string」在**中出現時,自動分配空間,在記憶體中的存放是string\0,占用7個byte. 「string」本身可以作為乙個位址來看,該位址就是s字母所在的記憶體位置。

8.str=「string」是: 開始已經定義了乙個char 指標str,且沒指向任何地方。該語句,把乙個string字串加上\0結束符存放在記憶體中,並且把該字串的位址,也就是s的位址,即「string」給str,使str指向「string」所在的空間。

9.ch=「string」是不對的。 ch是乙個陣列。陣列名雖然也就是陣列第乙個元素的位址。與指標有相似的地方。但是指標可以指向任意的地方。陣列一旦定義,其位址就是固定的,陣列名ch所指向的地方就只能是ch[0]的位址,是不能夠修改的,不能夠再指向其他的地方了。這裡可以理解為系統給ch陣列分配了一段10byte的空間。「string」也有另一段7byte的空間,但是ch是不能重新指向「string」所在的地方的。

10.str=null同第8項。 str定以後,指向未知區域。後面可以把str指向乙個有效區域或者乙個null區域。最好在定義的時候就給它指向null區域,以免出現第6項中的崩潰問題。在使用str的時候,再給它乙個有效位址,如第8項中的賦值。

11.ch=null同第9項。ch作為陣列名,記憶體是在定義時就分配好的。不能再指向其他地方,或者null。

12.在定義並初始化 char *str時,可以char *str=ch,陣列ch的起始位址,給str,把該位址存放在str所在的4byte空間中。

12.在定義之後,賦值時,str=??  是把??作為乙個位址,給到str,存放在str所在的4byte的記憶體空間,如第6項。所以會出現類似str=ch2,或者str=「string」,這個語句的作用是讓str指向其他的位址。另不能出現str=12等現象,因為12做作為乙個位址,在記憶體中的資料是程式設計師不知道的,萬一該位址的資料被修改了,會破壞系統資料,造成未知問題。

13.*str=??是把??作為乙個字元,給到*str,存放在str所指向的位址記憶體空間。該語句的作用是改變str所指向的空間內所儲存的值,而不會改變str所指向的地方。例如char *str=「string」; *str=『f』,則以%s格式列印出str後,輸出為ftring。另%s格式輸出,會一str所指向的位址開始,一直輸出到\0結束。

14.??=*str,是把str所指向的位址的資料,賦值給??。 例如如果str指向「string」, 則char c=*str的作用等同於char c=『s』。

15.ch為陣列名,其指向的地方不能改變,但其指向的地方的內容可以改變。如ch=??不對。但是ch[0]='w'是正確的。

16.str是指標,指標本身占有4byte的儲存空間,該空間內儲存了乙個資料,該資料是記憶體中其他地方的位址。所以可以通過修改該資料,來使str指向其他的位址,如第12項。也可以通過*str來修改str所指向的位址內所儲存的資料,如第13條。

17.「string」是乙個位址。該位址就是s字母所在的位址。他可以作為乙個位址賦值給指標,如str=「string」(在指標str定義,並初始化時,可以char *str=「string」格式。)

18.ch的固定性,你可以把ch 按照 char * const ch理解。即ch指向的位址不能變。但ch指向位址內的資料可以變。

html

指標和陣列名及字串的區別

學習嵌入式技術有一段時間了,對於c語言容易混淆不清楚的地方自己做了一下總結 指標和陣列名 這裡不談原理和概念 自己總了他們在用法上的不同和相同 例子 int a 10 int b 不同 1 sizeof 不同 sizeof a 為整個陣列的記憶體,sizeof b 為指標的記憶體一般是4位元組 2 ...

陣列名和指標

c c 陣列名與指標區別深層探索 看了這篇文章之後,終於將混淆了很久的概念搞清楚了。1 陣列名的內涵在於其指代的實體是一種資料結構,其資料結構就是陣列 2 陣列名的外延在於其可轉換為指向其指代實體的指標,而且是乙個指標常量 3 指向陣列的指標則是另外一種變數型別,僅僅意味著陣列的存放位址。陣列名在作...

陣列名與指標

引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...