本文主要介绍了C数组的定义和初始化,具有很好的参考价值。希望对你有帮助。来和边肖一起看看吧。
c提供了一种数据结构,即数组,它存储一组固定大小的相同类型的有序元素。
数组中的元素存储在一个连续的内存位置,可以通过数组索引访问该位置。最低地址对应于第一个元素,最高地址对应于最后一个元素。
声明数组
例如
声明一个定长数组:
const int Size=5;
int arr[Size]={3,6,9,12,15 };
arr[3]=42;
注意:方括号[]中的内容(表示数组中元素的个数)必须是常量表达式,因为数组是静态内存块,大小必须在编译时确定,程序才能运行。
初始化数组
int arr[]={ 10,20,30,40 }
声明固定长度数组同时被初始化
const int Size=5;
int arr[Size]={ 10,20,30,40 }
上面的声明方法用于定义一个静态数组。静态数组的内存大小应该在编译时确定,数组应该在堆栈上分配。然而,在某些情况下,程序的内存需求只能在运行时确定。例如,何时需要存储空间取决于用户输入。在这些情况下,程序需要动态分配内存,所以C语言集成了运算符new和delete。
动态数组
使用运算符new分配动态内存。New后跟数据类型说明符。如果需要一个以上的元素序列,这些元素的数量包括在括号[]中。它返回一个指向分配的新内存块开始的指针。它的语法是:
指针=新类型
指针=新类型[元素数量]
示例:
int * foo
foo=new int[5];
在这种情况下,系统将为int类型的五个元素动态分配空间,并返回一个指向序列中第一个元素的指针,该指针被赋给foo(一个指针)。因此,foo现在指向一个包含五个int类型元素的有效内存块。
这里,foo是一个指针。因此,可以使用表达式foo [0]或表达式* foo(两者等效)来访问foo指向的第一个元素。您可以使用foo [1]或*(foo 1)来访问第二个元素,依此类推.
静态数组和动态数组最重要的区别在于,静态数组的大小必须是一个常数表达式,所以必须在设计程序的时候确定,然后运行。但是,new执行的动态内存分配可以使用任何变量值作为大小来在运行时分配内存。因为foo是一个指向动态数据的指针,这个数据可以被删除,新的数据可以赋给这个指针。
int * foo=new int[5];//arr现在指向一个大小为5的动态数组
删除[]foo;
foo=new int[10];//arr现在指向一个大小为10的动态数组
删除[]foo;
foo=new int(5);//arr现在指向一个值为5的单个int。
删除foo
生成二维动态数组
int * * a=new int *[rowCount];
for(int I=0;我行计数;我)
a[I]=new int[colCount];
总结:
静态数组和动态数组的区别
1.静态数组的大小在编译时确定并分配,其内存在使用后由计算机自动释放,效率高;动态数组是程序员在程序运行时根据实际需要从堆内存中动态申请的,使用后由程序员释放,效率低下。
2.当对静态数组执行sizeof操作时,结果是整个数组的sizeof,而当对动态数组执行Sizeof操作时,结果是常数4,因为地址位是4个字节。
3.从寻址的角度来说,静态数组是直接寻址的,而动态数组是两次寻址的,这和动态数组本身的实现有关。静态数组的变量本身就是数组第一个元素的地址。动态数组的变量存储指向应用程序空间第一个地址的指针。int Arr[Size]中的arr本身是一个内存地址,而int *foo中的foo是一个指向地址的指针。
补充知识:c++、c中数组初始化默认值如何为0
1.制造全局变量。
int sum[1000006];//将默认值初始化为0。
2.制造局部变量。
默认值只能设置为0,初始化时也只能设置为0(sum[100]={ 0 };这样写是不对的);
如果设置为1,则只有sum[0]为1,其他默认为0;
int sum[100]={ 0 };//只能设置为0
3.遍历分配
实际意义与0的循环赋值相同,只是这个方法是由库封装的。
#include cstring//必须被引用
memset(sum,0,sizeof(sum));
以上关于C数组的定义和初始化的详细讲解,是边肖分享的全部内容。希望给大家一个参考,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。