關(guān)于C語言中的指針與二維數(shù)組
引言
本文探討的是如何通過指針訪問二維數(shù)組中的元素,以及二維數(shù)組如何在內(nèi)存中存儲
指向一維數(shù)組的指針:
我們先來看下如何通過指針訪問一維數(shù)組
#include <stdio.h>
int main(){
int arr[] = {4, 3, 2, 1};
// 由于數(shù)組名是第一個元素的指針,對數(shù)組名進行解引用(*arr:此操作稱為解引用)就能拿到第一個元素
printf("*arr=%d arr[0]=%d\n", *arr, arr[0]);
// 對指針+1就能拿到第二個元素的指針,依次類推
printf("*(arr+1)=%d arr[1]=%d\n", *(arr+1), arr[1]);
return 0;
}二維數(shù)組的存儲形式:
c中的二維數(shù)組其實是一維數(shù)組的線性擴展,二維數(shù)組在內(nèi)存中其實是以一維的形式存儲。
比如:int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}} 在內(nèi)存中的存儲格式如下:
| arr[0] | arr[1] | arr[2] |
⇓
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
指向二維數(shù)組的指針:
在c語言中我們可以把二維數(shù)組看作一維數(shù)組來處理,只不過這個數(shù)組的元素也是數(shù)組。比如:arr[3,4] 我們可以認為這個數(shù)組由三個一維子數(shù)組構(gòu)成,而這三個一維數(shù)組都包含了4個元素
在一維數(shù)組中數(shù)組名就是第一個元素的指針,當(dāng)我們將二維數(shù)組看作一個一維數(shù)組時,我們就可以推出:數(shù)組名是前n個元素組成的數(shù)組的指針(arr[3][4] n的值就是4)
請看下面例子:
#include <stdio.h>
int main(){
int arr[3][4] = {0};
printf("sizeof(int):%d\n", sizeof(int)); //sizeof(int):4
printf("arr:%p",arr); // arr:000000000062FDE0
printf("arr+1:%p",arr+1); // arr+1:000000000062FDF0
return 0;
}
地址結(jié)果相減我們可以得出10,但這是16進制的結(jié)果,轉(zhuǎn)為10進制結(jié)果就是16。由于int類型占4個字節(jié),我們可以得出arr與arr+1相差了4個元素,把二維數(shù)組的看作一維數(shù)組那么這里元素之間的跨度就是4個元素(4*4=16個字節(jié))。由此得出 arr 指向的是第一個子數(shù)組的指針,arr+1 指向的是第二個子數(shù)組的指針 …
既然 arr 指向的是第一個子數(shù)組的指針,那么 *arr(解引用) 的值就是第一個子數(shù)組的地址,更確切的說 *arr 是第一個子數(shù)組的第一個元素的地址,只有 **arr (雙重解引用)才能拿到第一個子數(shù)組的第一個元素的值。
我們看如下代碼:
#include <stdio.h>
int main(){
int arr[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
// 打印結(jié)果發(fā)現(xiàn) *arr == &arr[0][0],又一次證明arr指向“第一個子數(shù)組”
printf("*arr = %p &arr[0][0] = %p\n", *arr, &arr[0][0]);
printf("**arr = %d arr[0][0] = %d\n", **arr, arr[0][0]);
printf("*(*arr+1) = %d arr[1][0] = %d\n", *(*arr+1), arr[0][1]);
printf("**(arr+1) = %d arr[0][0] = %d\n", **(arr+1), arr[1][0]);
return 0;
}這樣的做法就是通過指針來拿數(shù)組中的元素,與下標(biāo)獲取數(shù)組元素的結(jié)果是一致的。
測試題:
int arr[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
// 輸出下面的結(jié)果
printf("*(*(arr+1)+1) = %d\n", *(*(arr+1)+1) );
printf("*(*(arr[2])+1) = %d \n",*(*(arr[2])+1) );到此這篇關(guān)于關(guān)于C語言中的指針與二維數(shù)組的文章就介紹到這了,更多相關(guān)指針與二維數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼
這篇文章主要介紹了 C++實現(xiàn)一個線程安全的單例工廠實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
C++ auto自動類型推導(dǎo)規(guī)則和使用詳解
C++11 賦予 auto 關(guān)鍵字新的含義,使用它來做自動類型推導(dǎo)。也就是說,使用了 auto 關(guān)鍵字以后,編譯器會在編譯期間自動推導(dǎo)出變量的類型,這樣我們就不用手動指明變量的數(shù)據(jù)類型了2022-08-08
c++ 虛函數(shù),虛表相關(guān)總結(jié)

