9.7.3 变量长度数组与函数参数 了解了变量长度数组值的类型,就可以写出以变量长度数组作为实参的函数。以9.7.2小节中的“int d[n][n];”为例,考虑用一个函数判断“d” 是否构成一个单位矩阵。 首先,由于“d”作为右值的类型为“int (*)[n]”或“int [ ][n ]”,所以在函数原型中对应参数的类型为“int (*)[n]” 或“int [ ][n ]”。这表示一指向变量长度数组的指针。其中的“n”也可以写成其他标识符,如写成“int (*)[k]”。问题在于“n”或“k”这个标识符在使用前必须得到说明,这是C语言的一个原则。所以在此参数类型之前必须有另外一个参数—关于“k” 的类型说明。此外,数组第一维度的长度也必须作为参数。这样函数原型就应当写成: “int shi_dwz(int k, int (*)[k] , int );”或“int shi_dwz(int k, int [][k] , int );” 与此相对应,函数的定义可以写成下面的形式 “int shi_dwz(int m, int (*p)[m] , int n){/*……*/}”或“int shi_dwz(int m, int p[][m] , int n){/*……*/}” 这样描述的函数定义及函数原型具有更广泛的适用范围,它可以接受任何二维数组作为参数,无论其是否为方阵,也无论其是否为变量长度数组。下面代码给出了这种函数的写法和测试。 程序代码9-27
#include<stdio.h>
#include<stdlib.h>
#define SHI 1
#define FOU 0
int shi_dwz(int k,int(*)[k],int);
int main(void)
{
int n = 4 ;
int d[n][n];//一个方阵
int(*p)[n];
p = d ;
int i , j ;
for( i = 0 ; i < n ; i ++)//形成一个单位方阵
{
for( j = 0 ; j < n ; j ++)
*(*(p+i)+j )=(i==j);
}
printf("数组 d %s是方阵\n", shi_dwz(4, d , 4)?"":"不");
int a[3][3]
={{ 1 , 0 , 0},
{ 0 , 1 , 0},
{ 0 , 0 , 1}
};
printf("数组 a %s是方阵\n", shi_dwz(3, a , 3)?"":"不");
int b[2][3]
={{ 1 , 0 , 0 },
{ 0 , 1 , 0 },
};
printf("数组 b %s是方阵\n", shi_dwz(3, a , 2)?"":"不");
system("PAUSE");
return 0;
}
//判断数组是否构成方阵
int shi_dwz(int m,int(*p)[m],int n)
{
if( m != n )
return FOU ;
int i , j ;
for( i = 0 ; i < n ; i++)
{
for( j = 0 ; j < m ; j++)
{
if(*(*(p+i)+j)!=( i==j ))
return FOU ;
}
}
return SHI ;
}
测试结果如图9-26所示。
图9-26 变量长度数组与函数参数
按照C99标准,“int shi_dwz(int k, int (*)[k] , int );”这样的函数原型也可以不写出“[k]”里的那个“k”,而代之以“*”,这样也就无需对“k”的类型进行说明,即把函数原型写成: