C语言之数组2

2. 初始化

2.1 整体初始化

对比下面三段代码,分析输出。

  1. 代码一
int arr[12];
for(int i=0;i<12;++i){
    printf("%d ",arr[i]);
}
  1. 代码二
int arr[12] = {0};
for(int i=0;i<12;++i){
    printf("%d ",arr[i]);
}
  1. 代码三
int arr[12] = {2};
for(int i=0;i<12;++i){
    printf("%d ",arr[i]);
}

结论:

  1. 数组未初始化,数组里面的值都是随机值。
  2. 数组初始化为{0},数组里面的值都是0。
  3. 数组初始化为{非零值},数组里面第一个值是非零值,其他的值都是0。

2.2 部分初始化

int arr[12] = {[2]=2,[5]=5};
for(int i=0;i<12;++i){
    printf("%d ",arr[i]);
}

指定下标的值被赋值,其他的值都是0

2.3 大小

sizeof函数

char carr[12];
int iarr[12];
double farr[12];
printf("carr = %d\n",sizeof(carr));
printf("iarr = %d\n",sizeof(iarr));
printf("farr = %d\n",sizeof(farr));

sizeof给出整个数组所占据的内容的大小。数组大小=元素大小*数组个数。

2.4 赋值

int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int arr = days;

这种方式对数组赋值对吗?答案是错误的,daysarr 是数组名,而数组名表示的是数组“第一个元素”的“起始地址”。即 daysarr 表示的是地址,是一个常数,不能将一个常数赋给另一个常数。

正确的写法是用 for 循环,将数组days 中的元素一个一个赋给数组arr的元素。

3. 数组与指针

数组名是数组第一个元素的地址。
数组下标实现的操作指针也可以实现。

NO. 操作 下标 指针
1 i个元素值 arr[i] *(arr+i)
2 i个元素地址 &arr[i] arr+i

arr[i]*(arr+i)完全等价;
&arr[i]arr+i 完全等价。

所以,遍历数组可以是:

int arr[] = {1,2,3,4,5,6,7,8};
for(int i=0;i<8;++i){
    printf("%d\n",*(arr+i)); 
}

数组名是不可改变的。
数组下标比较易于理解,数组指针更灵活更高效。

4. 函数与数组

4.1 传递数组给函数

数组作为函数参数时,通常必须再用一个参数传入数组大小。

返回值类型 函数名(类型 参数名[],int size){

}

或者:

返回值类型 函数名(类型* 参数名,int size){

}

数组作为参数时,数组退化成指针,不能利用sizeof获取数组大小,也就不能计算数组元素个数。

4.2 从函数返回数组

C 语言不允许返回一个完整的数组作为函数的参数。通过指定不带索引的数组名来返回一个指向数组的指针。

类型* 函数名() {
   return 数组名;
}

重点

int arr[] = {1,2,3,4,5,6};
// sizeof(数组名)
printf("sizeof(arr) = %ld\n",sizeof(arr));
// 数组名的值
printf("arr=%p\n&arr[0]=%p\n",arr,&arr[0]);

数组名的值是地址

  1. 可以使用指针操作:解引用
  2. 数组作为函数参数和返回值时,传指针/地址。
发布了39 篇原创文章 · 获赞 4 · 访问量 709

猜你喜欢

转载自blog.csdn.net/weixin_44718794/article/details/103613880