表達式中罕有異常的數組被轉換爲指向其第一個元素的指針。
從C標準(6.3.2.1左值,數組和功能指示器)
3除了當它是sizeof操作或一元& 操作者的操作數,或是字面使用的字符串爲了初始化一個數組,一個 表達式的類型爲'''的數組被轉換爲 表達式,該表達式的類型''指針指向類型'',指向數組對象的初始 元素並且不是左值。如果數組對象 具有寄存器存儲類,則行爲未定義。
因此,如果你有一個數組聲明如下
T a[N];
其中T
是某種類型和N
是一些積分表達式則陣列可以被轉換爲一個指針通過以下方式。
,首先讓我們來重寫聲明如下方式
T (a[N]);
我們得到的指針剛剛替補的聲明符括號a[N]
的*p
。例如
T (a[N]);
T (*p) = a;
因此,如果你有這樣
T a[N1][N2];
一個多維數組然後指針到它的第一元件可以被定義如下方式
T (a[N1])[N2];
T (*p)[N2] = a;
在一般情況下可以使用規則
T a[N1][N2]...[Nn];
相當於
T (a[N1])[N2]...[Nn];
和指針的定義如下
T (a[N1])[N2]...[Nn];
T (* p)[N2]...[Nn] = a;
在你的程序中,有報關
int a[3][4] = {1,2,3,4,
5,6,7,8,
9,0,1,6};
可以改寫成以上已經顯示像
int (a[3])[4] = {1,2,3,4,
5,6,7,8,
9,0,1,6};
所以指針數組的第一個元件將具有int (*)[4]
因此該函數應至少聲明如下
void display(int (*)[4], int, int);
類型考慮到該函數內
void display(int (*p)[4],int r,int c)
{
int i,j,*q;
for(i=0;i<r;i++)
{
q=p+i;
for(j=0;j<c;j++)
printf("%d",*(q+j));
printf("\n");
}
}
有一個不兼容的類型
q=p+i;
表達p + i
的分配的類型爲int (*)[4]
,而指針q
的類型爲int *
。
應當寫入
q = *(p + i);
在這種情況下,表達*(p + i)
具有int *
此外,根據C標準不帶參數的函數main
被隱式轉換的類型的指針類型int[4]
應聲明爲
int main(void)
如果使用只有指針而不是索引來訪問所述陣列的元件則該函數可以看看下面的方式,因爲它是在示範程序中所示
#include <stdio.h>
#define COLS 4
void display(int (*)[COLS], size_t);
int main(void)
{
int a[][COLS] =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 0, 1, 6 }
};
const size_t ROWS = sizeof(a)/sizeof(*a);
display(a, ROWS);
}
void display(int (*p)[COLS], size_t rows)
{
for (int (*p_row)[COLS] = p; p_row != p + rows; ++p_row)
{
for (int *p_col = *p_row; p_col != *p_row + COLS; ++p_col)
{
printf("%d ", *p_col);
}
putchar('\n');
}
}
它的輸出是
1 2 3 4
5 6 7 8
9 0 1 6
它是傳統的,包括一個問題在問題職位。 –