文章目录
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]);
}
结论:
- 数组未初始化,数组里面的值都是随机值。
- 数组初始化为
{0}
,数组里面的值都是0
。 - 数组初始化为
{非零值}
,数组里面第一个值是非零值
,其他的值都是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
获取数组大小,也就不能计算数组元素个数。
- 练习
- 打印数组所有元素。
- 查找
- 替换
- 任意范围 +给定数组随机填充指定范围的数据。
使用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