最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言 指針與二維數(shù)組詳解

 更新時間:2016年08月24日 08:51:28   投稿:lqh  
本文主要介紹C語言 指針與二維數(shù)組,這里整理了詳細(xì)的資料及示例代碼,有需要的小伙伴可以參考下

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

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

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

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

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

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

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

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

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

int (*p)[4] = a;

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

[ ]的優(yōu)先級高于*,( )是必須要加的,如果赤裸裸地寫作int *p[4],那么應(yīng)該理解為int *(p[4]),p 就成了一個指針數(shù)組,而不是二維數(shù)組指針,這在《C語言指針數(shù)組》中已經(jīng)講到。

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

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

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

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

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

#include <stdio.h>
int main(){
 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)));
 return 0;
}

運行結(jié)果:

16

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

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

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

根據(jù)上面的結(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ù)組。

#include <stdio.h>
int main(){
 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");
 }
 return 0;
}

運行結(jié)果:

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

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

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

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

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

以上就是C語言 指針和二維數(shù)組的資料整理,后續(xù)繼續(xù)補充相關(guān)知識,謝謝大家對本站的支持!

相關(guān)文章

  • 教你用C語言實現(xiàn)三子棋

    教你用C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單三子棋程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Linux下用Valgrind做檢查(防止內(nèi)存泄露)

    Valgrind是一款基于模擬linux下的程序調(diào)試器和剖析器的軟件套件,可以運行于x86, amd64和ppc32架構(gòu)上。valgrind包含一個核心,它提供一個虛擬的CPU運行程序,還有一系列的工具,它們完成調(diào)試,剖析和一些類似的任務(wù)
    2014-01-01
  • C++實現(xiàn)LeetCode(136.單獨的數(shù)字)

    C++實現(xiàn)LeetCode(136.單獨的數(shù)字)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(136.單獨的數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • QT計算時間差的方法詳解

    QT計算時間差的方法詳解

    這篇文章主要為大家詳細(xì)介紹了利用QT實現(xiàn)計算兩個時間的時間差的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • 枚舉類型的定義和應(yīng)用總結(jié)

    枚舉類型的定義和應(yīng)用總結(jié)

    如果一種變量只有幾種可能的值,可以定義為枚舉類型。所謂“枚舉類型”是將變量的值一一列舉出來,變量的值只能在列舉出來的值的范圍內(nèi)
    2013-10-10
  • C語言詳細(xì)分析講解關(guān)鍵字const與volatile的用法

    C語言詳細(xì)分析講解關(guān)鍵字const與volatile的用法

    在C語言中,我們經(jīng)常會見到const和volatile這兩個關(guān)鍵字,那么我們今天就來介紹下這兩個關(guān)鍵字,提起?const?關(guān)鍵字,我們可能首先想到的是經(jīng)過它修飾的變量便是常量了。其實我們這種想法是錯誤的,其實?const?修飾的變量是只讀的,其本質(zhì)還是變量
    2022-04-04
  • C語言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解

    C語言中指針 int *p=0;和int *p;*p=0;和”&“的關(guān)系和區(qū)別詳解

    這篇文章主要介紹了C語言中指針 int *p=0;和int *p;*p=0;和”&“有什么關(guān)系和區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • 淺析C語言中對于char*和char[]的理解

    淺析C語言中對于char*和char[]的理解

    char * s 只是一個保存字符串首地址的指針變量,char a[]是許多連續(xù)的內(nèi)存單元,單元中的元素是char型,char * 和 char a[]具有相同的效果,源于字符串的本質(zhì),這篇文章主要介紹了C語言中對于char*和char[]的理解,需要的朋友可以參考下
    2023-02-02
  • C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    C語言驅(qū)動開發(fā)之內(nèi)核使用IO/DPC定時器詳解

    本章將繼續(xù)探索驅(qū)動開發(fā)中的基礎(chǔ)部分,定時器在內(nèi)核中同樣很常用,在內(nèi)核中定時器可以使用兩種,即IO定時器,以及DPC定時器,感興趣的可以了解一下
    2023-04-04
  • 基于C語言實現(xiàn)簡單的掃雷小游戲

    基于C語言實現(xiàn)簡單的掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實現(xiàn)簡單的掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

丰镇市| 璧山县| 南漳县| 清水河县| 葫芦岛市| 武威市| 蒲江县| 泰顺县| 米泉市| 临沂市| 囊谦县| 泌阳县| 梁河县| 新绛县| 临汾市| 交城县| 肇州县| 嫩江县| 靖江市| 淄博市| 丹江口市| 昌都县| 恭城| 德格县| 钟山县| 博白县| 乌海市| 林芝县| 昭平县| 富锦市| 靖远县| 临武县| 奈曼旗| 宜城市| 旬阳县| 昌吉市| 新昌县| 双流县| 措勤县| 盐城市| 长沙市|