数组
int a =10; //定义一个变量并初始化
int b; //定义一个变量未初始化,值为随机值
int arr[10]={1,2,3,4,5,6,7,8,9,10}; //定义一个数组并初始化
int brr[10]; //定义一个数组未初始化,里面的值为随机值
int crr[10]={1,2,3,4}; //数组前四位是1,2,3,4,剩下六位都是0
char drr[]={a,b,c,d,e}; //数组长度可以不写,系统会根据数组里面的内容自动分配长度
注:像数组和结构体都属于聚合类型,聚合类型如果只初始化一部分,那么剩余未初始化的部分值为0。
数组的下标是从0开始的,不是从1开始,这个要特别注意,防止越界。
sizeof:返回一个类型占用的字节数
sizeof(int ) 4
sizeof(double) 8
sizeof(1) 4 //1是整型,占四个字节
sizeof(arr) 40 //arr是一个含有十个整型变量的数组,所以返回的是40
sizeof(drr) 5 //drr是一个有五个字符型变量的数组,所以返回的是 5
那根据sizeof可以求数组长度吗?
当然可以了。40=4*10;5=5*1,数组占用的字节数就是数组的长度和每个变量占的字节数的乘积。所以求数组长度用总的字节数除以每个占的字节就可以了。
不同数组的类型可能不同,char,int ,double...能不能统一表示这些类型呢?
引入数组首元素,首元素也保证数组不会越界,不同数组首元素占用的字节不同,但是能代表每个变量占的字节数。
len:sizeof(arr)/sizeof(arr[0])
注意:只能在定义数组的同一个函数中求sizeof,一般是在主函数中使用,传参的时候使用。
逆序输出数组的值
怎么样逆置一个数组呢?只需要将第一个值和最后一个值交换,第二个和倒数第二个交换,直到交换到一半的时候,就完成了逆置。
{
for(int i=0;i<len/2;i++) //交换一半就够了,如果小于的是长度,就交换了两次,数组不会发生改变
{
int tmp=arr[i];
arr[i]=arr[len-1-i]; //注意数组下标是从0开始,记得减一,否则就会越界。
arr[len-1-i]=tmp;
}
}
{
for(int i=0;i<len;i++)
{
printf("%d ",arr[i]);
}
}
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
Reverse(arr,len);
Show(arr,len);
return 0;
}
形参和实参类型要一致,整型数组一定要传长度
数组名表示整个数组,只有两种情况:
1.在定义数组的同一个函数中&arr+1,加的是整个数组的大小
2.在定义数组的同一个函数中求sizeof
其它情况,数组名表示数组首元素的地址。
扩展知识:
c的标准规定,如果定义一个变量不初始化,值为随机值,数组也是一样,没有初始化都是随机值,但是我们实际应用会发现并不是一个随机值,而是-858993460,十六进制是0Xcccccccc,每次都是这个值,不是规定应该是一个随机值吗,为什么不随机了?
标准规定确实是这样,但是如果我们用微软的编译器,比如vs,它就是上面那个值,这是微软故意设的标记,如果未初始化,就是这个值,如果想使用这个未初始化的值,程序会崩溃,在这里崩溃防止以后犯更大的错误,但是gcc并没有这样设置,里面就是一个随机值,也不会崩溃。
定义数组的时候可以用变量吗?
定义数组可以用常量,对于变量,不同的编译器规定的不同。C99已经允许可以用变量定义数组,所以在gcc里面可以用变量定义数组,但是微软的编译器不支持用变量定义数组。如果用微软的编译器,就不能用变量定义数组。