欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言二維數(shù)組指針的概念及使用

 更新時(shí)間:2023年02月11日 09:49:02   作者:Elanie1024  
C語言中的二維數(shù)組是按行排列的,也就是先存放a[0]行,再存放a[1]行,最后存放a[2]行;每行中的4個(gè)元素也是依次存放。數(shù)組a為int類型,每個(gè)元素占用4個(gè)字節(jié),整個(gè)數(shù)組共占用48個(gè)字節(jié)

二維數(shù)組

二維數(shù)組在概念上是二維的,有行和列,但在內(nèi)存中所有的數(shù)組元素都是連續(xù)排列的,它們之間沒有“縫隙”。以下面的二維數(shù)組 a 為例:

int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

從概念上理解,a 的分布像一個(gè)矩陣:

0 1 2 3
4 5 6 7
8 9 10 11

但在內(nèi)存中,a 的分布是一維線性的,整個(gè)數(shù)組占用一塊連續(xù)的內(nèi)存:

C語言中的二維數(shù)組是按行排列的,也就是先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行;每行中的 4 個(gè)元素也是依次存放。數(shù)組 a 為 int 類型,每個(gè)元素占用 4 個(gè)字節(jié),整個(gè)數(shù)組共占用 4×(3×4) = 48 個(gè)字節(jié)。

C語言允許把一個(gè)二維數(shù)組分解成多個(gè)一維數(shù)組來處理。對(duì)于數(shù)組 a,它可以分解成三個(gè)一維數(shù)組,即 a[0]、a[1]、a[2]。每一個(gè)一維數(shù)組又包含了 4 個(gè)元素,例如 a[0] 包含 a[0][0]、a[0][1]、a[0][2]、a[0][3]。

假設(shè)數(shù)組 a 中第 0 個(gè)元素的地址為 1000,那么每個(gè)一維數(shù)組的首地址如下圖所示:

為了更好的理解指針和二維數(shù)組的關(guān)系,我們先來定義一個(gè)指向 a 的指針變量 p:

int (*p)[4] = a;

括號(hào)中的*表明 p 是一個(gè)指針,它指向一個(gè)數(shù)組,數(shù)組的類型為int [4],這正是 a 所包含的每個(gè)一維數(shù)組的類型。

[ ]的優(yōu)先級(jí)高于*,( )是必須要加的,如果寫作int *p[4],那么應(yīng)該理解為int *(p[4]),p 就成了一個(gè)指針數(shù)組,而不是二維數(shù)組指針。

對(duì)指針進(jìn)行加法(減法)運(yùn)算時(shí),它前進(jìn)(后退)的步長與它指向的數(shù)據(jù)類型有關(guān),p 指向的數(shù)據(jù)類型是int [4],那么p+1就前進(jìn) 4×4 = 16 個(gè)字節(jié),p-1就后退 16 個(gè)字節(jié),這正好是數(shù)組 a 所包含的每個(gè)一維數(shù)組的長度。也就是說,p+1會(huì)使得指針指向二維數(shù)組的下一行,p-1會(huì)使得指針指向數(shù)組的上一行。

數(shù)組名 a 在表達(dá)式中也會(huì)被轉(zhuǎn)換為和 p 等價(jià)的指針!

下面我們就來探索一下如何使用指針 p 來訪問二維數(shù)組中的每個(gè)元素。按照上面的定義:

1) p指向數(shù)組 a 的開頭,也即第 0 行;p+1前進(jìn)一行,指向第 1 行。

2) *(p+1)表示取地址上的數(shù)據(jù),也就是整個(gè)第 1 行數(shù)據(jù)。注意是一行數(shù)據(jù),是多個(gè)數(shù)據(jù),不是第 1 行中的第 0 個(gè)元素,下面的運(yùn)行結(jié)果有力地證明了這一點(diǎn):

#include<stdio.h>
intmain(){
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
int(*p)[4]= a;
printf("%d\n",sizeof(*(p+1)));
return0;
}

運(yùn)行結(jié)果:

16

3) *(p+1)+1表示第 1 行第 1 個(gè)元素的地址。如何理解呢?

*(p+1)單獨(dú)使用時(shí)表示的是第 1 行數(shù)據(jù),放在表達(dá)式中會(huì)被轉(zhuǎn)換為第 1 行數(shù)據(jù)的首地址,也就是第 1 行第 0 個(gè)元素的地址,因?yàn)槭褂谜袛?shù)據(jù)沒有實(shí)際的含義,編譯器遇到這種情況都會(huì)轉(zhuǎn)換為指向該行第 0 個(gè)元素的指針;就像一維數(shù)組的名字,在定義時(shí)或者和 sizeof、& 一起使用時(shí)才表示整個(gè)數(shù)組,出現(xiàn)在表達(dá)式中就會(huì)被轉(zhuǎn)換為指向數(shù)組第 0 個(gè)元素的指針。

4) *(*(p+1)+1)表示第 1 行第 1 個(gè)元素的值。很明顯,增加一個(gè) * 表示取地址上的數(shù)據(jù)。

根據(jù)上面的結(jié)論,可以很容易推出以下的等價(jià)關(guān)系:

a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)

【實(shí)例】使用指針遍歷二維數(shù)組。

#include<stdio.h>
intmain(){
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
    p=a;
for(i=0; i<3; i++){
for(j=0; j<4; j++)printf("%2d  ",*(*(p+i)+j));
printf("\n");
}
return0;
}

運(yùn)行結(jié)果:

0 1 2 3
4 5 6 7
8 9 10 11

指針數(shù)組和二維數(shù)組指針的區(qū)別

指針數(shù)組和二維數(shù)組指針在定義時(shí)非常相似,只是括號(hào)的位置不同:

int*(p1[5]);//指針數(shù)組,可以去掉括號(hào)直接寫作 int *p1[5];
int(*p2)[5];//二維數(shù)組指針,不能去掉括號(hào)

指針數(shù)組和二維數(shù)組指針有著本質(zhì)上的區(qū)別:指針數(shù)組是一個(gè)數(shù)組,只是每個(gè)元素保存的都是指針,以上面的 p1 為例,在32位環(huán)境下它占用 4×5 = 20 個(gè)字節(jié)的內(nèi)存。二維數(shù)組指針是一個(gè)指針,它指向一個(gè)二維數(shù)組,以上面的 p2 為例,它占用 4 個(gè)字節(jié)的內(nèi)存。

到此這篇關(guān)于C語言二維數(shù)組指針的概念及使用的文章就介紹到這了,更多相關(guān)C語言二維數(shù)組指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文)

    C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文)

    這篇文章主要介紹了C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文),需要的朋友可以參考下
    2016-06-06
  • 適合初學(xué)者的C語言轉(zhuǎn)義字符講解

    適合初學(xué)者的C語言轉(zhuǎn)義字符講解

    轉(zhuǎn)義字符是很多程序語言、數(shù)據(jù)格式和通信協(xié)議的形式文法的一部分。對(duì)于一個(gè)給定的字母表,一個(gè)轉(zhuǎn)義字符的目的是開始一個(gè)字符序列,使得轉(zhuǎn)義字符開頭的該字符序列具有不同于該字符序列單獨(dú)出現(xiàn)(沒有轉(zhuǎn)義字符開頭)時(shí)的語義。因此轉(zhuǎn)義字符開頭的字符序列被叫做轉(zhuǎn)義序列
    2022-04-04
  • C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能示例

    C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能示例

    這篇文章主要介紹了C語言用棧和隊(duì)列實(shí)現(xiàn)的回文檢測(cè)功能,結(jié)合具體實(shí)例形式分析了C語言棧和隊(duì)列的定義及使用棧和隊(duì)列進(jìn)行回文檢測(cè)的操作技巧,需要的朋友可以參考下
    2017-06-06
  • C++中多線程的執(zhí)行順序如你預(yù)期嗎

    C++中多線程的執(zhí)行順序如你預(yù)期嗎

    這篇文章主要為大家詳細(xì)介紹一下C++中多線程的執(zhí)行順序的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C++多線程有一定幫助,需要的可以參考一下
    2022-10-10
  • C語言實(shí)現(xiàn)五子棋游戲

    C語言實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 使用C++實(shí)現(xiàn)全排列算法的方法詳解

    使用C++實(shí)現(xiàn)全排列算法的方法詳解

    本篇文章是對(duì)使用C++實(shí)現(xiàn)全排列算法的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系

    使用代碼驗(yàn)證linux子進(jìn)程與父進(jìn)程的關(guān)系

    Linux下父進(jìn)程可以使用fork 函數(shù)創(chuàng)建子進(jìn)程,但是當(dāng)父進(jìn)程先退出后,子進(jìn)程會(huì)不會(huì)也退出呢?通過下面這個(gè)小實(shí)驗(yàn),我們能夠很好的看出來
    2014-02-02
  • VisualStudio2019配置OpenCV4.5.0的方法示例

    VisualStudio2019配置OpenCV4.5.0的方法示例

    這篇文章主要介紹了VisualStudio2019配置OpenCV4.5.0的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++操作SQLite簡(jiǎn)明教程

    C++操作SQLite簡(jiǎn)明教程

    這篇文章主要介紹了C++操作SQLite簡(jiǎn)明教程,包含創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)等常用操作,需要的朋友可以參考下
    2014-06-06
  • 教你用Matlab制作黃金礦工小游戲

    教你用Matlab制作黃金礦工小游戲

    黃金礦工作為經(jīng)典的單機(jī)小游戲,一直深受大家的喜愛。本文將用Matlab制作這一款經(jīng)典的游戲,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以了解一下
    2022-03-03

最新評(píng)論