int a; int* a; int** a; int (*a)[]; int (*a)(int)


a) int a;表示一個內存空間,這個空間用來存放一個整數(int);
b) int* a;表示一個內存空間,這個空間用來存放一個指針,這個指針指向一個存放整數的空間,即a)中提到的空間;
c) int** a;表示一個內存空間,這個空間用來存放一個指針,這個指針指向一個存放指針的空間,並且指向的這個空間中的指針,指向一個整數。也簡單的說,指向了一個b)中提到的空間;
d) int (*a)[4];表示一個內存空間,這個空間用來存放一個指針,這個指針指向一個長度為4、類型為int的數組;和int** a的區別在於,++、+=1之后的結果不一樣,其他用法基本相同。
以上四種類型見上圖表示。
e) int (*a)(int);表示一個內存空間,這個空間用來存放一個指針,這個指針指向一個函數,這個函數有一個類型為int的參數,並且函數的返回類型也是int。

重點:

int *p[]和int (*p)[]

前者是指針數組,后者是指向數組的指針。更詳細地說。

前: 指針數組;是一個元素全為指針的數組.
后: 數組指針;可以直接理解是指針,只是這個指針類型不是int也不是char而是 int [4]類型的數組.(可以結合函數指針一並看看......)

int*p[4]------p是一個指針數組,每一個指向一個int型的
int (*q)[4]---------q是一個指針,指向int[4]的數組。

定義涉及兩個運算符:“*”(間接引用)、“[]”(下標),“[]”的優先級別大於“*”的優先級別。

  首先看int *p[4],“[]”的優先級別高,所以它首先是個大小為4的數組,即p[4];剩下的“int *”作為補充說明,即說明該數組的每一個元素為指向一個整型類型的指針。int *p[4]的存儲結構如下:(存儲方格橫向排列或豎向排列沒區別,只要按內存地址順序排列就行,此處只是為畫圖方便)

 



    再看int (*q)[4]。它首先是個指針,即*q,剩下的“int [4]”作為補充說明,即說明指針q指向一個長度為4的數組。int (*q)[4]的存儲結構如下:

請看以下定義:

int a[2][4]={{2,5,6,8},{22,55,66,88}};

int c[4]={5,8,9,4};

int d[3]={23,12,443};

int *p[4],(*q)[4];

q=a;

*p=c;

*(p+1)=d;

則int *p[4]和int (*q)[4]的存儲數據為:

驗證:

 

 

 

 

 

 

 

#include <stdio.h>

int main(void)

{

    int a[2][4]={{2,5,6,8},{22,55,66,88}};

    int c[4]={5,8,9,4};

    int d[3]={23,12,443};

    int *p[4],(*q)[4];

    q=a;

    *p=c;

    *(p+1)=d;

    int i,j;

    for(i=0;i<2;i++)

        for(j=0;j<4;j++)

       {

           if((i==1)&&(j==3)) break;

           printf("*(*(p+%d)+%d)=%d\n",i,j,*(*(p+i)+j));

       }

    puts("===============");

    for(i=0;i<2;i++)

       for(j=0;j<4;j++)

           printf("*(*(q+%d)+%d)=%d\n",i,j,*(*(q+i)+j));

   return 0;

}

 

輸出結果為:

*(*(p+0)+0)=5

*(*(p+0)+1)=8

*(*(p+0)+2)=9

*(*(p+0)+3)=4

*(*(p+1)+0)=23

*(*(p+1)+1)=12

*(*(p+1)+2)=443

===============

*(*(q+0)+0)=2

*(*(q+0)+1)=5

*(*(q+0)+2)=6

*(*(q+0)+3)=8

*(*(q+1)+0)=22

*(*(q+1)+1)=55

*(*(q+1)+2)=66

*(*(q+1)+3)=88


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM