-
一直深信,数组长度必须是一个编译时可确定的常数,最近才发现自己真的是out了,自己真的是老了。
C99标准已经支持变长数组,换言之,数组的长度可以在运行时确定,没有任何问题。但是有个问题,就是数组只能够声明,不能初始化,因为编译器并不知道数组的长度,无法初始化。
请看下面的例子:
第一个例子,表明数组长度可以直到运行时才确定。
第二个例子表明,运行时才能确定长度的数组,不能初始化。
-
#include<stdio.h>
int test_array()
int a ;
printf("please input the array's length \n");
scanf("%d",&a);
int b[a] ;
printf("We can define a array with len we input\n");
b[a-1] = 3;
printf("the last element of array is %d\n",b[a-1]);
return 0;
int main()
test_array();
return 0;
}
int test_array()
int a ;
printf("please input the array's length \n");
scanf("%d",&a);
int b[a] = {0,};
printf("We can define a array with len we input\n");
b[a-1] = 3;
printf("the last element of array is %d\n",b[a-1]);
return 0;
int main()
test_array();
return 0;
}
VC++编译均不通过,GCC编译器第一段程序通过,第二段不通过
-
-
2.int num = 5;
arr[num];
若使用arr[],则
需要
在后面对齐进行初始化,来指定长度,否则
编译
可以通过,但是默认只有一个单元,超过一个单元的长度,在后面程序的运行中有可能会被冲掉
int arr[] = {0};//定义了一个单元的数组,并不是不定长数组
最好不用使用arr[] = {0}来定义数组,定义数组之前应要指定长度
int arr[256] = {0};
int a[256]={0};并不是把
每个程序在执行
时
都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap)。C语言用一堆标准库函数malloc和free在自由存储区中分配存储空间,而
C++
则用new和delete表达式实现相同的功能。
一、new和delete创建和释放动态数组:数组类型的变量有三个重要的限制:
数组长度
固定,在
编译
时
必须知道其长度,数组只在定义它的语句内存在。动态数组:长度固定,
编译
时
不必知道其长度,通常是运行
时
确定
;一直存在,直到程序显示释放它。
1、动态数组的定义:数组变量通过指定类型、数据名和维数来定义。而动态分配数组
时
,只需指定类型和数组长
arr[5]=10;//语法无误,
编译
时
报错:java.lang.ArrayIndexOutOfBoundsException
System.out.println(arr[5]);//语法无误,
编译
时
报错:错误同上
//方法二:使用for循环动态赋值
//导入java.util.*;包
Scanner input=new Scanner(System.in);
int [] arr=new int[5];
for(int i=0;i<arr.length;i++)
System.out.println("请输入第"+(i+1)+"个值");
arr[i]=input.nextInt();
//方法三:声明
时
赋值
int [] arr=new int[]{23,45,56,67};
int [] arr1={23,45,56,67};
int [] arr2= new int[5]{23,45,56,67};//错误,此
时
不能给
确定
的长度
int [] arr=new int[]{23,45,56,67};
//方法一:使用for循环输出
for(int i=0;i<arr.length;i++)
System.out.println(arr[i]);
//方法二:使用foreach输出:此为JDK5.0 新特性
for(int item : arr)
System.out.println(item);
常见算法:
1. 求一维数组中的最大[小]值
2. 求一维数组中的总和,平均值
3. 添加,删除,修改,搜索等
具体请参考本人FTP\\5.0S1\\JAVA\\数组完整操作范例。[重复让人如此崩溃!]
(1)malloc 和 free 用于执行动态内存分配的释放
(2)malloc 所分配的是一块连续的内存
(3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* malloc(size_t size);
(4)free 用于将动态内存归还系统:
问:c/
c++
在建立数组
时
能否以变量作为
数组长度
?首先明确的表示:不能!!!c/
c++
在数组初始化
时
数组的长度都必须是一个常数,不能是变量(但可以是常变量),这一点是毋庸置疑的。但是为什么提出这个问题呢,是因为在使用codeblocks和dev
时
发现,
数组长度
在初始化
时
用变量,不报错!代码为证:非但没有报错,在后面对其赋值也是正确且可行的(吓得我回去赶紧翻书),发现这其实是很多
编译
器的扩展,为方便...
在数组定义的
时
候,括号中定义
数组长度
使用的是整形变量,在dev
c++
和codeblocks上
编译
后,没有显示语法错误。但是在普通的oj提交平台上测试后显示语法错误。int n;int a[n];上面的代码原意是想创建一个动态数组,输入的n有多少,数组的长度就有多长。
2.字符串。String b[ ] = { };定义空字符串数组。String b[ ] = {"mike1","mike2" };定义一个初始有元素的字符串数组。
关键:求取
数组长度
。
void setup(){
Serial.begin(9600);
int size
}}数组的大小可以程序运行的
时
候才定义吗?不。在数组的定义中,数组的大小必须是
编译
时
可知的,不能是在程序运行
时
才可知的。例如,假设i是一个变量,你就不能用i去定义一个数组的大小:char array[i];有些语言支持这种定义,但C语言不支持。如果C语言支持这种定义,栈就会变得更复杂,调用函数的开销就会更大,而程序的运行速度就会明显变慢。如果数组的大小在
编译
时
是可知的,即使它是一个非常复杂的表达式...