数组:
概念: 同一类型的元素的集合体。
注: 这里的类型不仅仅指C语言中的基本类型如int flaoat char 之类的,还包括很多构造类型,如指针,结构体,数组等。
对数组的基本使用 : 数组只能在定义时对其整体进行初始化,不能在其它地方整体进行赋值。C语言规定数组的下标默认从0开始。定义数组时数组中括号里面的值只能是常量或常量表达式!
int arr[10]={1,2,3,4,5,}//正确
arr[10]={1,2,3,4,5}//错误
数组的初始化需要注意以下几点: 数组 可以只给部分元素赋值。当[ }中值的个数少于元素个数时,只给前面部分元素赋值,后面的元素整型默认为0,字符默认为‘0’,指针默认为NULL…例如:
int a[10]={1, 2, 3 , 4, 5};
表示只给 a[0]~a[4] 5个元素赋值,而后面 5 个元素自动初始化为 0。
当赋值的元素少于数组总体元素的时候,剩余的元素自动初始化为 0:
对于short、int、long,就是整数 0;
对于char,就是字符 ‘\0’;
对于float、double,就是小数 0.0。
如果给数组的全部元素赋值可以省略数组的大小,数组默认的大小为数组元素的个数的大小。
int arr[]={1,2,3,4,5};
int arr[5]={1,2,3,4,5};
//两者是等价的
利用for循环对数组进行赋值,及对数组进行遍历:
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
多维数组
如果某个数组的维数不止一个,它就被称为多维数组,其中一维的维数可以省略不写,原因后面介绍
因为内存是线性结构,因此不论是一维数组还是多维数组,都可以将它们看做一维数组来对待。
如:
int arr[3][4]={0};
这是创建了一个包含12个整型元素的二维数组,它虽然看着好像 三行四列。但其实它在内存中的存储形式其实是这样的:
因为所有的数组都是一维数组,只是这个数组里面的元素依然是一个数组而已,这个数组包含四个整型元素。你可以像操作一维数组那样操作它,只是它有12个元素。
数组名
几乎每个书上都会写数组名是数组首元素的地址,大多数情况下也确实如此,C语言中只有两种情况下数组名代表整个数组:
int arr[10]={0};
&arr代表整个数组的地址,这是个数组指针。赋给整型指针就会有警告,而且它每次加1或者减1,跳过整个数组大小的长度。
sizeof(arr),sizeof是C语言中的关键字,不是一个函数,它的作用是求一个变量或类型所占空间的大小,以字节为单位这个表达式的意义是数组总的字节数,因此我们可以这样求一个数组的元素的个数
int sz=sizeof(arr)/sizeof(arr[0]);
数组名作为函数参数
当数组进行传参时,会发生降级问题,降为指针,什么指针呢?指向其元素类型的指针!因此整型一维数组降为整型指针,整型二维数组降为整型一维数组指针,字符串数组降为二级字符指针…
如何证明它会发生降级问题呢?
void fun(char arr[10])
{
printf("%d\n",sizeof(arr));
}
这个值得结果在32位平台下将是4,因为在32位机器上任何指针的大小都是四个字节。
void fun(char arr[10])
{
printf("%d\n",sizeof(arr));
}
void fun(char *arr])
{
printf("%d\n",sizeof(arr));
}
这两中写法是一模一样的,而且在第一种写法中方括号中的10可以省略不写。因为此处它是一个指针,并不是一个数组。
为什么要发生降级呢?
传参的过程其实是拷贝的过程,函数里面的变量在函数调用时会被分配空间,因此如果不发生降级问题的话,就得分配整个数组大小的空间,这必然造成很大的资源浪费,因为只要我们传参的时候再把数组元素的个数传进去就可以完成对数组的所有操作!而且像结构体也最好传一个结构体指针!