数组的定义:
初始化:定义数组是即赋值,赋满值。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
半初始化:先将定义的值优先放入数组前面,聚合类型只初始化一部分,剩余部分都为0.
int brr[10]={1,2,3};
未初始化:为随机值,而不是全部填充0。
int crr[10];
数组的访问(有关于数组越界的问题)
先给出一个程序的部分:
int i;
int arr[10];
for(i=0;i<=10;i++)
{
printf("%d\n",i);
arr[i]=0;
}
这个程序存在数组越界的问题,给数组赋值超过了数组的长度,导致程序出现死循环,原因如下:
首先i存放在高地址中,数组依次由高地址往地址存放,i不断自增,赋值给数组每一个元素,当arr[10]时为越界,非法占用了i的内存,使得i的值又变为0,导致死循环(不同的的编程软件先进性不同,有些程序可能会导致崩溃,例如有些程序为了防止越界的发生,将栈间各个变量之间的内存存有两个内存空格。)
数组的区别表示:
一维数组名arr在如下情况表示整个数组:
1.在定义数组的同一个函数下,sizeof(arr);
例如:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
sizeof(arr); // 此处可以表示为整个数组,结果为40;
但是如下情况:
void Show(int arr[10]) //实际已经退化成指针
void Show(int *arr,int len)
{
sizeof(arr)/sizeof(arr[0]); //不能求数组的长度,因为此处的sizeof(arr)表示的是指针,整型指针的长度为4,结果为1
2.在定义数组的同一个函数下,取地址+1;&arr+1;
此处的意思表示为地址+整个数组的字节数;
数组长度的表示:
倒置:
void Reverse(int *arr,int len)
{
int tmp;
for(int i=0;i<len/2;i++)
{
tmp = arr[i];//arr[i] == *(arr+i)
arr[i] = arr[len-1-i];
arr[len-1-i] = tmp;
}
}
主函数中:Reverse(arr,sizeof(arr)/sizeof(arr[0])) //调用子函数,利用上点中数组名arr表示整个数组的性质,利用运算算出数组的长度传给形参。