表达式中罕有异常的数组被转换为指向其第一个元素的指针。
从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
它是传统的,包括一个问题在问题职位。 –