登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

仙剑奇侠传的博客

羽化成仙

 
 
 

日志

 
 

c99数组新特性之二(可变长度数组)  

2011-08-28 15:54:36|  分类: C |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

一、可变长度数组概述

没有可变长度数组功能之前,要实现可变长度数组功能,一般是通过malloc从堆中分配内存形成可变长度数组,可变长度数组使用完成用free释放。这种方式可变长度数组,就是数组的长度在运行时才能确定的数组。

  1. 声明可变长度数组语法:T 数组名标识符[变量名] 。说明:T除了void、不完整类型、函数类型之外的任何c类型。数组名,符合c的有效的标识符即可。变量名要求为正整数也就是无符号整型。
  2. 定义示例:int a1[n];/*声明一个整型变长数组,数组长度为n*/ ,struct s a2[n];/*为结构类型struct s声明数组a2,长度为a2 */
  3. 可变长度数组的作用域从其声明位置到包含数组声明的最内层代码块的结束,其生命周期为从程序执行到其声明位置开始,至程序离开其作用域。其内层代码块如:for循环、while循环、switch、if结构、函数都是内层代码块。
  4. 可变长度数组不能声明为全局数组(用extern)或静态数组(用static修饰)。想象下,全局数组与静态数组是存在程序的全局内存区,在编译时就得确认内存空间大小,当然不能全局的或静态的。
  5. 可变长数组不能为复合字面值,这个也是理所当然的。复合字面值请参见我的上一篇文意。

二、可变长度数组例子

#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]);

 

 

 

  评论这张
 
阅读(3189)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018