一、可变长度数组概述
没有可变长度数组功能之前,要实现可变长度数组功能,一般是通过malloc从堆中分配内存形成可变长度数组,可变长度数组使用完成用free释放。这种方式可变长度数组,就是数组的长度在运行时才能确定的数组。
二、可变长度数组例子
#include<stdio.h> #include<malloc.h>
/************************************************ 本程序演示变长数组 author:wsysoft@gmail.com ***********************************************/ /*int a,b; extern int a2[a][b]; 会报错,全局范围变量必须要能确定空间,可变长度数组变量不能放 error: variably modified 'a2' at file scope */ /******************************** int a,b; static int a3[a][b]; static修饰的变量也必须确认空间,不能放 *********************************/
void stackAray(int,int);
static void stackStructArray(int a1,int a2);
void printArray(int a1,int a2,int (*array)[*]);
typedef struct s { int x; int y; } point;
int main(){ int a1,a2; printf("请录入数组第一维长度:\n"); scanf("%d",&a1); printf("请录入数组第二维长度:\n"); scanf("%d",&a2); stackStructArray(a1,a2); stackAray(a1,a2); return 1; }
void stackAray(int a1,int a2){ int i,j; int array1[a1][a2]; /*array1[3][5]=3; 有可能是不可预料的结果 */ int (*a) [a2] =array1;/*ok 表指向二维可变长数组的指针变量*/ /************************************************* int **c=array1; printArray(a1,a2,c);// error 类型不相容 int **与int (*)[] ******************************************************* / /*int * a[a2];not ok ,非法语句*/ printf("数组输出为:\n"); for (i=0;i<a1 ;i++ ) { for(j=0;j<a2;j++) { array1[i][j]=(i+1)*(j+1); } } printArray(a1,a2,a);
}
static void stackStructArray(int a1,int a2){ int i,j; point array1[a1][a2]; printf("结构数组输出为:\n"); for (i=0;i<a1 ;i++ ) { for(j=0;j<a2;j++) { array1[i][j].x=i*j; array1[i][j].y=i*j; } } }
void printArray(int a1,int a2,int array[][a2]){ printf("列印二维数组:\n"); int n,j;//得到1维数组大小 for (n=0;n<a1 ;n++ ) { for(j=0;j<a2;j++){ printf("%d\t",array[n][j]); } } } |
三、可变修改类型(variable modified type)
包手可变长度的数组与其相关的指针,如
int a[n] 其指针表示就是 int (*) a;
int a[n][j] 其指针表示就是 int (*a)[j];记得一定要有括号,如果写成 int * a [j]这个语句,那是非法的了,表示a[j]这个一维数组保存整数地址。
可变长度类型指针可以用const \volatile\static\restrict修饰
四、可变长度数组作形参
可变长度数组传递其实就是传其对应的指针,其函数原形的形参可以用*表示。如上代码void printArray(int c,int array[*][c]);,当然也可以表示成void printArray(int c,int array[*][*);还可以表示成void printArray(int c,int (*array) [c]);
评论