基础6.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

完整代码见001_array_init.c

#include <stdio.h>

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

1.2 部分初始化

试一下代码,分析输出。

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

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

1.3 大小

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

printf("carr = %d\n",sizeof(carr));//12
	printf("iarr = %d\n",sizeof(iarr));//48
	printf("farr = %d\n",sizeof(farr));//96

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

printf("sizeof(tests) = %d\n",sizeof(tests));
	printf("sizeof(tests[0]) = %d\n",sizeof(tests[0]));
	printf("num = %d\n",sizeof(tests)/sizeof(tests[0]));//(2)元素的个数的求法;
}

(完整代码见002_array_size.c)

#include <stdio.h>

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

	int tests[] = {
   1,4,5,7,3,2,8,9,10,11,45,32,12,67,90,78,56,32,89,45,1,3,5,7,8,9,0};
	printf("sizeof(tests) = %d\n",sizeof(tests));
	printf("sizeof(tests[0]) = %d\n",sizeof(tests[0]));
	printf("num = %d\n",sizeof(tests)/sizeof(tests[0]));//(2)元素的个数的求法;
}

1.4 赋值

试一下下面的代码

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

2. 数组与指针

数组名是数组第一个元素的地址。
数组下标实现的操作指针也可以实现。
(完整代码见003——array_point.c)

#include <stdio.h>

int main(){
   
	int days[]={
   31,28,31,30,31,30,31,31,30,31,30,31};
	//int arr = days;
	printf("days = %p\n",days);
	printf("days = %ld\n",days);
	printf("&days[0] = %ld\n",&days[0]);

}

注意:进行区分;
scanf("%p",&p); //(1)输入需要修改的地址
scanf("%d",p);//(2。1)输入需要修改的值
scanf("%d",&m);//(2。2)输入需要修改的值
(完整代码见004——address.c)

#include <stdio.h>

int main(){
   
	int m=0;
	int n=0;
	printf("&m=%p\n",&m);
	printf("&n=%p\n",&n);

	int* p;
	scanf("%p",&p); //(1)输入需要修改的地址
	scanf("%d",p);//(2。1)输入需要修改的值
	scanf("%d",&m);//(2。2)输入需要修改的值
       
	printf("m=%d\n",m);
	printf("n=%d\n",n);

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

所以,遍历数组可以是

完整代码见005_bianli.c

#include <stdio.h>

int main(){
   
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){
   
    
    }
    

或者

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

}

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

  • 练习
    1. 打印数组所有元素。
    2. 查找
    3. 替换
    4. 任意范围 +给定数组随机填充指定范围的数据。
      使用stdlib.h中的srand(time(NULL))rand()

常见的数组作为指针的应用
(1)打印函数;

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

(2)每一项都增加一个数字;

int* add_num(int* arr,int size,int n){
   
	for(int i=0;i<size;++i){
   
		arr[i] += n;
	}
	return arr;
}

(3)生成任意范围的数组;

int* rand_arr(int* arr,int size,int start,int end){
   
	srand(time(NULL));
	for(int i=0;i<size;++i){
   
		arr[i] = rand()%(end-start)+start;
	}
	return arr;
}

(4)寻找元素的索引;

int find_arr(int* arr,int size,int m){
   
	int index = -1;
	for(int i=0;i<size;++i){
   
		if(arr[i] == m){
   
			index = i;
			break;
		}
	}
	return index;
}

(完整代码见006_array_func.c)

#include <stdio.h>
#include <stdlib.h> // srand() rand()
#include <time.h> // time()
//void print_arr(int arr[],int size){
   
//(1)打印函数;
void print_arr(int* arr,int size){
   
	for(int i=0;i<size;++i){
   
		printf("%d ",arr[i]);
	}
	printf("\n");
}
//(2)每一项都增加一个数字;
int* add_num(int* arr,int size,int n){
   
	for(int i=0;i<size;++i){
   
		arr[i] += n;
	}
	return arr;
}
//(3)生成任意范围的数组;
int* rand_arr(int* arr,int size,int start,int end){
   
	srand(time(NULL));
	for(int i=0;i<size;++i){
   
		arr[i] = rand()%(end-start)+start;
	}
	return arr;
}
//(4)寻找元素的索引;
int find_arr(int* arr,int size,int m){
   
	int index = -1;
	for(int i=0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值