#include
<stdio.h>
#include
<string.h>
#include
<stdlib.h>
int
main()
{
printf("输入要分配的内存大小:")
int
size
scanf("%d",
&size)
//输入自定义的数组长度
int
*pstart
=
(int
*)malloc(sizeof(int)
*size)
if
(pstart==0)
{
printf("不能分配内存\n")
return
0
}
memset(pstart,
0x00,
sizeof(int)
*
size)
int
inx
for
(inx=0
inx!=size
++inx)
pstart[inx]
=
inx
for
(inx=0
inx!=size
++inx)
printf("%d\t",
pstart[inx])
printf("\n")
return
0
}
用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度。
比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补0)位移。例如,将11100011右移3比特,算术右移后成为11111100,逻辑右移则为00011100。
运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。
C语言特点:
其一,广泛性。C语言的运算范围的大小直接决定了其优劣性。C语言中包含了34种运算符,因此运算范围要超出许多其它语言,此外其运算结果的表达形式也十分丰富。
其二,简洁性。9类控制语句和32个关键字是C语言所具有的基础特性,使得其在计算机应用程序编写中具有广泛的适用性,不仅可以适用广大编程人员的操作,提高其工作效率,同时还能够支持高级编程,避免了语言切换的繁琐。
C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。
比如int a[] = {1,2,3,4,5}数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。
但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。
1 由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。
通过下面例子来理解该方法:
#include <stdio.h>#include <stdlib.h>
int main()
{
int size=100//最初为100个元素空间。
int *a = NULL
int i = 0
a = malloc(sizeof(int) * size)
if(a == NULL) return -1
while(scanf("%d", a+i) == 1)//循环向a中输入数据,直到输入非数值字符为止
{
i++
if(i == size)//数组空间不足
{
size *=2 //将数组空间扩大二倍, 也可以改用size+=100之类的操作,使size每次增加固定值。
a=realloc(a,size)//分配新的空间
if(a==NULL)
{
return -1//这种情况下运行载体(如PC)内存不足以提供,中断程序。
}
}
}
if(a) free(a)//对申请的内存进行释放。
return 0
}
从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。 直到占满所有剩余空间。
如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。
所以这种方法可以做到软件意义上的无限大数组空间。
但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。
2 事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。