c語言數組指針。本站提示廣大學習愛好者:(c語言數組指針)文章只能為提供參考,不一定能成為您想要的結果。以下是c語言數組指針正文
這兩天學習數組指針,被搞的很蛋疼,分享一下
首先是簡單的一維數組
定義一個數組int arr[5]; arr是指向數組第一個元素的int類型指針,arr+1就是指針數組第二個元素的int類型的指針,*arr就是取這個指針裡面對應的值,這個比較好理解
int arr[5] = { 1, 2, 3, 4, 5 };//定義數組 printf("\n%x", *arr);//1 =arr[0] printf("\n%x", *(arr+1));//2 =arr[1]
到了二維數組這邊比較蛋疼,找了很久找到一句話來解釋我的疑惑,然後一切就迎刃而解
定義一個二維數組int arr[2][3]
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; printf("\n%d", sizeof(*(&arr)));//24 printf("\n%d", sizeof(*arr));//12
二維數組分為行和列,這是一個兩行三列的數組,
第一個是&arr是取整個數組的指針,對應類型是int[2][3] ,所以它的對應值的大小是24(每個數字占四個字節)。
第二個 arr代表第一行的數組指針,這裡可能需要大家動動腦子,在第一個例子一維數組int arr[3] 裡面,arr默認就是第一個元素所對應的指針,類型是int,而指針自增每次的增加量=sizeof(你所用的數據類型)
所以arr+1的值會加4(因為一維數組所對應的元素的指針類型是int,4個字節),所以+1會找到數組的下個元素地址,並*地址求得指針地址對應的值,但是二維數組的裡面的值不是int類型,而是int[3]
,所以arr是指向二維數組的第一行的指針,也就是對應裡面的{1,2,3}的值,所以它的大小是12個字節
這個時候我們又運行了一段程序
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } }; printf("\n%x", arr);// printf("\n%x", *arr);//
發現兩個的值都是這個數組的首地址,第一個是數組第一行的指針,所以直接打印會打印出第一行的首地址很正常,我們能理解
但是第二個不是應該打印第一行的值嗎?
原來是因為使用整行數據沒有實際的含義,編譯器遇到這種情況都會轉換為指向該行第 0 個元素的指針 就像一維數組的名字,在定義時或者和 sizeof、& 一起使用時才表示整個數組,出現在表達式中就會被轉換為指向數組第 0 個元素的指針。 所以如果我們輸入 **arr就會打印出該行的第0列的元素的值,也就是1