二維數組及指標

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   io   資料   2014   

首先,看一維數組。

[]符號是下標運算子,a[i]就是*(a+i)

那麼a[i][j] 就是*(a[i]+j)=*(*(a+i)+j)

 本人對二級和多級指標的理解:1.抽象上說二級指標的內容是地址的地址。變數A好像跟你捉迷藏似的,你要想找到A,你先得去一個地方把A的地址給找出來,然後再根據這個地址找到A。就類似武俠電影裡的寶藏,你要先去一個人的背上發現藏寶圖,然後再根據藏寶圖裡畫的地址找到寶藏,在這裡,這個人的背就是一個最外層的地址,藏寶圖就是內層的地址。2.對於二級指標和多級指標,定義時,我們用多層衣服包裹上,先披上內層,再套上外層。而在使用二級指標和多級指標時,恰恰相反,我們要先脫去外層,再解開內層。

 再看二級指標和二維數組及二維數組名之間的一些關係。

先運行下小程式。

#include<stdio.h>void main() {    int a[2][3] = {{1,2,3},{4,5,6}};    printf("\n");    printf("a[0]的值:%x\n",a[0]);    printf("a[0][0]的地址:%x\n",&a[0][0]);    printf("a的值:%x\n",a);    printf("\n");    printf("a[1]的值:%x\n",a[1]);    printf("a[1][0]的地址:%x\n",&a[1][0]);    printf("a+1的值:%x\n",a+1);}

運行結果:

結果分析:a+1是按照行移動的。

接下去我們定義二級指標。看下面小程式。

/****  @author:hushunfeng**    */#include<stdio.h>void main() {    int a[2][3] = {{1,2,3},{4,5,6}};    int **p = a;    printf("p+1之前:%d\n",p);    p++;    printf("p+1之後:%d\n",p);}

結果:

顯然,二級指標的移動不是我們預想中的+12,而是+4,而這裡的+4和int型沒關係,換成char或者其他類型都是一樣。說明程式的寫法存在問題。

我們對程式進行改進:

/****  @author:hushunfeng**    */#include<stdio.h>void main() {    int a[2][3] = {{1,2,3},{4,5,6}};    //改進的地方    int **p = (int**)a;    printf("p+1之前:%d\n",p);    p++;    printf("p+1之後:%d\n",p);

 運行結果:還是不行!

為了證實之前說的內容,我們把int型換成char型嘗試。

/****  @author:hushunfeng**    */#include<stdio.h>void main() {    char a[2][3] = {{‘a‘,‘b‘,‘c‘},{‘d‘,‘e‘,‘f‘}};    //改進的地方    char **p = (char**)a;    printf("p+1之前:%d\n",p);    p++;    printf("p+1之後:%d\n",p);}

運行結果:還是老樣子,結果並沒有改變。

下面分析下產生這種情況的原因:1.首先我們定義的二級指標,那麼應該有兩層地址。

               2.char **p; 也可以寫成char*(*p),理解成*p的指標,也就是指標的指標。

               3.而對指標的以為操作中,指標移位的幅度都是按照所指向的資料類型來確定的,這也就是為什麼結構體stuct中,指標的移位都是以一整個結構體為單位的,而並不按照結構體內部的資料類型來一個個移位,以為整個結構體類型就是一個資料類型。這一點很重要!!

               4.按照(3)的原則,那麼char **p; p++;p所指向的類型還是一個指標類型,而指標類型就是一個地址,在32位系統下面就是佔4個位元組。所以p的值應該+4;這和p指標的指標指向的類型無關!!

                                

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.