C語言陣列指標指標陣列
在陣列指標和指標陣列這塊我總是弄不清楚,總結一下
指標陣列:用於儲存指標的陣列,也就是陣列元素都是指標
陣列指標:指向陣列的指標
關於這部分有一道題:一個有10個指標的陣列,該指標指向一個函式,該函式有一個整型引數並返回一個整型
這道題一開始我總是弄不清楚 正確答案:int (*a[10]) (int);區別:
型別名稱 *陣列名稱[陣列長度];
int* a[4] 指標陣列
表示:陣列a中的元素都為int型指標
元素表示:*a[i] *(a[i])是一樣的,因為[]優先順序高於*
int (*a)[4] 陣列指標
表示:指向陣列a的指標
元素表示:(*a)[i]
#include <stdio.h>
void main(void)
{
int c[4]={1,2,3,4};
int *a[4]; //指標陣列
int (*b)[4]; //陣列指標
b=&c;
//將陣列c中元素賦給陣列a
for(int i=0;i<4;i++)
{
a[i]=&c[i];
}
printf("%d\n",*a[1]); //輸出2就對 <pre name="code" class="plain"> printf("%d\n",<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(*b)[2] </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">); </span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">} </span>
注意:
定義了陣列指標,必須給指標指定一個數組的首地址
容易犯的錯得就是,不給 b 地址,直接用 (*b)[i]=c[i] 給陣列 b 中元素賦值,這時陣列指標不知道指向哪裡,除錯時可能沒錯,執行時會出現問題,使用指標時要注意這個問題。a就不用給他地址,a的元素是指標,for迴圈內已經給陣列a中元素指定地址了。若for迴圈內寫*a[i]=c[i],也會出問題。
瞭解陣列指標,與普通指標及二級指標的區別
{int a[4][5];int (*p)[5]=a;}
這裡a是個二維陣列的陣列名,相當於一個二級指標常量;
p是一個指標變數,它指向包含5個int元素的一維陣列,此時p的增量以它所指向的一維陣列長度為單位;
*p+i是二維陣列a[0][i]的地址;
*(p+2)+3表示a[2][3]地址(第一行為0行,第一列為0列),*(*(p+2)+3)表示a[2][3]的值。
(*p)[5]其中的5在上述例子中沒有表示任何意思你可以換成除0以外的整數,[5]的作用就是幫助你記憶說你所指向的一維陣列的長度。
(不過除了與定義的二維陣列的長度一致的不會警告之外 )其他的數會警告但是不影響結果。
//(*p)[5]其中的5換成其他的數字在vc++6.0環境中都無法通過編譯
陣列指標:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=a;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
}
printf("\n");
}
指標陣列:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(int ix=0;ix<3;ix++)
{
p[ix]=a[ix];
}
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
}
printf("\n");
}