c:数组(2)

1. 初始化

1.1 整体初始化

试一下下面三段代码,分析输出。

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

结论:

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

1.2 部分初始化

试一下代码,分析输出。

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

指定下标的值被赋值,其他的值都是0。这是C99语法。

1.3 大小

试一下,下面代码分析结果。

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给出整个数组所占据的内容的大小。数组大小=元素大小*数组个数。

问题:已知数组arr,如何求出数组元素个数?

1.4 赋值

试一下下面的代码

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

2. 数组与指针

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

NO.操作下标指针
1第i个元素值arr[i]*(arr+i)
2第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)); 
}

数组名是不可改变的。

数组下标比较易于理解,数组指针更灵活更高效。

3. 函数与数组

3.1 传递数组给函数

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

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

}

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

  • 练习
    一个长度为n数组,前m个数字和后面的m-n个数字是增序的,如何将数组整体合并成一个增序的数组。(归并中的合并处理)
#include<stdio.h>

void print_array(int* arr,int size){
 for(int i=0;i<size;++i){
   printf("%d ",arr[i]);
 }
 printf("\n");
}

int merge(int* arr,int n,int m){
 int res[n];
 int p=0,q=m,i=0;
 while(p<m&&q<n)
  res[i++]=arr[p]>arr[q]?arr[q++]:arr[p++];
 while(p<m)
  res[i++]=arr[p++];
 while(q<n)
  res[i++]=arr[q++];
 for(int i=0;i<n;++i){
  arr[i]=res[i];
 }
 return arr;
}

main(){
 int arr[]={1,9,10,13,14,15,2,8,12,18,19,20};
 print_array(arr,sizeof(arr)/sizeof(arr[0]));
 merge(arr,sizeof(arr)/sizeof(arr[0]),6);
 print_array(arr,sizeof(arr)/sizeof(arr[0]));
}

3.2 从函数返回数组

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

类型* 函数名() {
   return 数组名;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值