關(guān)于C語(yǔ)言中的指針與二維數(shù)組
引言
本文探討的是如何通過(guò)指針訪問(wèn)二維數(shù)組中的元素,以及二維數(shù)組如何在內(nèi)存中存儲(chǔ)
指向一維數(shù)組的指針:
我們先來(lái)看下如何通過(guò)指針訪問(wèn)一維數(shù)組
#include <stdio.h> int main(){ int arr[] = {4, 3, 2, 1}; // 由于數(shù)組名是第一個(gè)元素的指針,對(duì)數(shù)組名進(jìn)行解引用(*arr:此操作稱為解引用)就能拿到第一個(gè)元素 printf("*arr=%d arr[0]=%d\n", *arr, arr[0]); // 對(duì)指針+1就能拿到第二個(gè)元素的指針,依次類推 printf("*(arr+1)=%d arr[1]=%d\n", *(arr+1), arr[1]); return 0; }
二維數(shù)組的存儲(chǔ)形式:
c中的二維數(shù)組其實(shí)是一維數(shù)組的線性擴(kuò)展,二維數(shù)組在內(nèi)存中其實(shí)是以一維的形式存儲(chǔ)。
比如:int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}
在內(nèi)存中的存儲(chǔ)格式如下:
arr[0] | arr[1] | arr[2] |
⇓
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
指向二維數(shù)組的指針:
在c語(yǔ)言中我們可以把二維數(shù)組看作一維數(shù)組來(lái)處理,只不過(guò)這個(gè)數(shù)組的元素也是數(shù)組。比如:arr[3,4] 我們可以認(rèn)為這個(gè)數(shù)組由三個(gè)一維子數(shù)組構(gòu)成,而這三個(gè)一維數(shù)組都包含了4個(gè)元素
在一維數(shù)組中數(shù)組名就是第一個(gè)元素的指針,當(dāng)我們將二維數(shù)組看作一個(gè)一維數(shù)組時(shí),我們就可以推出:數(shù)組名是前n個(gè)元素組成的數(shù)組的指針(arr[3][4] n的值就是4)
請(qǐng)看下面例子:
#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進(jìn)制的結(jié)果,轉(zhuǎn)為10進(jìn)制結(jié)果就是16。由于int類型占4個(gè)字節(jié),我們可以得出arr與arr+1相差了4個(gè)元素,把二維數(shù)組的看作一維數(shù)組那么這里元素之間的跨度就是4個(gè)元素(4*4=16個(gè)字節(jié))。由此得出 arr 指向的是第一個(gè)子數(shù)組的指針,arr+1 指向的是第二個(gè)子數(shù)組的指針 …
既然 arr 指向的是第一個(gè)子數(shù)組的指針,那么 *arr(解引用) 的值就是第一個(gè)子數(shù)組的地址,更確切的說(shuō) *arr 是第一個(gè)子數(shù)組的第一個(gè)元素的地址,只有 **arr (雙重解引用)才能拿到第一個(gè)子數(shù)組的第一個(gè)元素的值。
我們看如下代碼:
#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指向“第一個(gè)子數(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; }
這樣的做法就是通過(guò)指針來(lái)拿數(shù)組中的元素,與下標(biāo)獲取數(shù)組元素的結(jié)果是一致的。
測(cè)試題:
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語(yǔ)言中的指針與二維數(shù)組的文章就介紹到這了,更多相關(guān)指針與二維數(shù)組內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 關(guān)于C語(yǔ)言一維數(shù)組算法問(wèn)題詳解
- C語(yǔ)言一維數(shù)組初步學(xué)習(xí)筆記
- C語(yǔ)言二維數(shù)組指針的概念及使用
- C語(yǔ)言與java語(yǔ)言中關(guān)于二維數(shù)組的區(qū)別
- 從頭學(xué)習(xí)C語(yǔ)言之二維數(shù)組
- C語(yǔ)言面試C++二維數(shù)組中的查找示例
- C語(yǔ)言二維數(shù)組幾種常用的表示方法
- C語(yǔ)言二維數(shù)組中的查找的實(shí)例
- C語(yǔ)言 指針與二維數(shù)組詳解
- 直觀理解C語(yǔ)言中指向一位數(shù)組與二維數(shù)組的指針
- C語(yǔ)言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)
相關(guān)文章
C++右值引用與移動(dòng)構(gòu)造函數(shù)基礎(chǔ)與應(yīng)用詳解
左值和右值都是針對(duì)表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對(duì)象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對(duì)象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語(yǔ)義的相關(guān)資料,需要的朋友可以參考下2023-02-02舉例解析設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用
這篇文章主要介紹了設(shè)計(jì)模式中的工廠方法模式在C++編程中的運(yùn)用,文中也對(duì)簡(jiǎn)單工廠模式和工廠方法模式進(jìn)行了簡(jiǎn)單的對(duì)比,需要的朋友可以參考下2016-03-03C++標(biāo)準(zhǔn)模板庫(kù)string類的介紹與使用講解
今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板庫(kù)string類的介紹與使用講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C++中sting類的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了C++中sting類的簡(jiǎn)單實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2016-08-08C++項(xiàng)目求Fibonacci數(shù)列的參考解答
今天小編就為大家分享一篇關(guān)于C++項(xiàng)目求Fibonacci數(shù)列的參考解答,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02