1.初始化相關問題
陣列未初始化,系統自動初始化為隨機值,若已確定陣列大小,卻未初始化完全,則系統把未初始化的陣列元素初始化為0.那麼字元陣列和指標陣列初始化為什麼呢?
我們跟蹤除錯,發現字元陣列已知大小卻未完全初始化,系統把剩餘的陣列元素初始化為\0(字串結束識別符號),同理指標陣列會自動初始化為空指標(指向null)。
2.陣列相關問題
1.陣列名到底表示什麼?
可以看出arr類似乙個指標(但和指標不同),指向陣列首元素,那麼10ff94cd表示什麼呢?
arr裡存了乙個位址,這個位址和arr[0]的位址一樣,因此陣列名可以當作陣列首元素的首位址。
拓展:陣列名和指標有什麼區別呢?
可以看出系統為指標p分配了記憶體來儲存自己的位址,而陣列名卻沒有自己的記憶體來儲存自己的位址。
2.陣列名不能在賦值符的左邊。陣列名如果在賦值符的右邊,意義為陣列首元素的首位址。
3.陣列作為函式引數直接傳遞
如果用陣列名作為引數,陣列名會退化為指向陣列首元素的指標。
4.陣列不允許越界。
5.陣列不能整體賦值。(如何整體賦值見下文本元陣列)
1.字元陣列的初始化
為什arr1後邊會輸出亂碼呢?
這個就要說一說\0(字串結束標誌符),printf用%s格式輸出字串時碰到\0才會停止,arr1中就沒有存\0,arr2和arr3最後都預設儲存了\0。
因為\0雖然不會輸出,但也是個字元佔一位元組記憶體,所以陣列記憶體分配太小,越界了。
2.如何實現陣列整體的賦值(這裡需要呼叫庫函式string.h)
a.賦值:strcpy(字串1,字串2)
把字串2賦值給字串1(字串1>=字串2,否則陣列越界,程式奔潰)
char arr1[7] = "single";
char arr2[4] = "dog";
char arr3[10] = ;
strcpy_s(arr2, arr1); //strcpy_s()更安全些,兩者功能一樣
拓展:在string.h庫中有求字串大小的函式strlen()
a.strlen()與sizeof()在求字串大小時的區別?
strlen()求的是字串真實的大小,不算』\0』的大小;
sizeof()求的是字串所佔記憶體的大小,算』\0』的記憶體大小。
string.h庫中還有許多的字串處理函式,如:puts(),gets(),strcat( , ),strcmp( , ),strlwr(),struor(),有興趣的可以自己去除錯學習.
C語言基礎篇 五
include include struct student 結構體定義一 typedef struct 結構體定義二 newstudent int main int argc,const char argv 注意 結構體定義,在花括號後面加分號 結構體變數初始化 struct 結構體名 變數名 s...
C 語言基礎篇
一 型別轉換 在 c 中,變數分為以下幾種型別 1.值型別變數可以直接分配給乙個值。它們是從類system.valuetype中派生的。值型別直接包含資料。比如int char float,它們分別儲存數字 字元 浮點數。當您宣告乙個int型別時,系統分配記憶體來儲存值。2.引用型別不包含儲存在變數...
c語言基礎(五)
型別名 int 10 變數名 arr int arr 10 表示包含十個int型別元素的陣列。定義陣列的時候,陣列的大小就確定了 完全初始化 int arr s 陣列沒有制定大小,編譯器預設後面的初始化是完全初始化 在陣列中,有 則初始化,另外上式中5後邊的,不影響 s這個數規定陣列大小,當然也可以...