目录
数组
数组的概念
一维数组的创建和初始化
数组创建
type arr_name[ 常量值 ];
int math[ 20 ];
当然我们也可以根据需要创建其他类型和大小的数组:
char ch[ 8 ];double score[ 10 ];
数组的初始化
有时候,数组在创建的时候,我们需要给定一些初始值,这种就称为初始化的。
int arr[ 5 ] = { 1 , 2 , 3 , 4 , 5 }; // 完全初始化int arr2[ 6 ] = { 1 }; // 不完全初始化//第⼀个元素初始化为 1 ,剩余的元素默认初始化为 0int arr3[ 3 ] = { 1 , 2 , 3 , 4 }; // 错误的初始化 - 初始化项太多
数组的类型
int arr1[ 10 ];// arr1数组的类型是 int [10]int arr2[ 12 ];// arr2数组的类型是 int[12]char ch[ 5 ];// ch 数组的类型是 char [5]
一维数组的使用
数组下标
int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
# include <stdio.h>int main (){int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };printf ( "%d\n" , arr[ 7 ]); //8printf ( "%d\n" , arr[ 3 ]); //4return 0 ;}
数组元素的打印
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
![](https://img-blog.csdnimg.cn/direct/b88b6b7e4be64a57b6f4db2a4e803532.png)
数组的输入
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
for(i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
一维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i = 0;
for(i=0; i<10; i++)
{
printf("&arr[%d] = %p\n ", i, &arr[i]);
}
return 0;
}
![](https://img-blog.csdnimg.cn/direct/e7102b2683b14281b405aaf3485cc37e.png)
sizeof 计算数组元素个数
# include <stido.h>int main (){int arr[ 10 ] = { 0 };printf ( "%d\n" , sizeof (arr));return 0 ;}
这里输出的结果是40,计算的是数组所占内存空间的总大小,单位是字节。
我们又知道数组中所有元素的类型都是相同的,只要计算出一个元素所占字节的个数,数组的元素个数就能算出来。这里我们选择第一个元素算大小就可以
# include <stido.h>int main (){int arr[ 10 ] = { 0 };printf ( "%d\n" , sizeof (arr[ 0 ])); // 计算⼀个元素的大小,单位是字节return 0 ;}
接下来就能计算出数组的元素个数:
# include <stido.h>int main (){int arr[ 10 ] = { 0 };int sz = sizeof (arr)/ sizeof (arr[ 0 ]);printf ( "%d\n" , sz);return 0 ;}
二维数组的创建
二维数组的概念
二维数组的创建
type arr_name[ 常量值 1 ][ 常量值 2 ] ;例如:int arr[ 3 ][ 5 ];double data[ 2 ][ 8 ];
二维数组的初始化
//不完全初始化int arr1[ 3 ][ 5 ] = { 1 , 2 };int arr2[ 3 ][ 5 ] = { 0 };
//完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
//按照行初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
初始化时省略行,但是不能省略列
int arr5[][ 5 ] = { 1 , 2 , 3 };int arr6[][ 5 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 };int arr7[][ 5 ] = {{ 1 , 2 }, { 3 , 4 }, { 5 , 6 }};
二维数组的使用
二维数组的下标
int arr[ 3 ][ 5 ] = { 1 , 2 , 3 , 4 , 5 , 2 , 3 , 4 , 5 , 6 , 3 , 4 , 5 , 6 , 7 };
# include <stdio.h>int main (){int arr[ 3 ][ 5 ] = { 1 , 2 , 3 , 4 , 5 , 2 , 3 , 4 , 5 , 6 , 3 , 4 , 5 , 6 , 7 };printf ( "%d\n" , arr[ 2 ][ 4 ]);return 0 ;}
二维数组的输入和输出
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;//遍历⾏
//输⼊
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
}
}
//输出
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
二维数组在内存中的存储
#include <stdio.h>
int main()
{
int arr[3][5] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
C99中的变长数组
如:int arr1[ 10 ];int arr2[ 3 + 5 ];int arr3[] = { 1 , 2 , 3 };
int n = a+b;int arr[n];
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩
int arr[n];
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
数组练习
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char arr1[] = "welcome to beijing!!!!!";
char arr2[] = "#######################";
int left = 0;
int right = strlen(arr1)-1;
while (left<=right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf("%s\n", arr2);
left++;
right--;
}
printf("%s\n", arr2);
return 0;
}
注:sizeof计算的是数组所占内存空间的大小,单位是字节
strlen求的是字符串的长度,统计的是字符串中\0之前的字符的个数。
char arr [ ] = "abc"; //a b c \0 其中a b c \0的下标分别为0 1 2 3
strlen(arr);// 计算arr的长度,输出3
int right = strlen(arr)-1; //即3-1,输出2
int right = sizeof(arr)-2;//即4-2,为什么-2,因为sizeof统计\0之前的元素,c的下标为2
练习2:
在一个有序的数组中查找指定的数,是否存在,存在则打印下标,不存在则说明不存在!
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);//7
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
if (arr[i] == k)
{
printf("找到了,下标是:%d\n", i);
break;
}
}
if (i == sz)
printf("找不到了\n");
return 0;
}
用二分查找(折半查找)可以这样写
#include <stdio.h>
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
//在arr数组中找k
int sz = sizeof(arr) / sizeof(arr[0]);//10
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] < k)
left = mid + 1;
else if (arr[mid] > k)
right = mid - 1;
else
{
printf("找到了,下标是:%d\n", mid);
break;
}
}
if (left > right)
printf("找不到了\n");
return 0;
}
mid = left+(right-left)/2
函数
库函数
![](https://img-blog.csdnimg.cn/direct/31f67db85e7d49a7a92e95f6c4d09e17.png)
![](https://img-blog.csdnimg.cn/direct/93ecd3b130b54b14bab08f89d799de14.png)
![](https://img-blog.csdnimg.cn/direct/b992b07c3476419cb27a67f4ecd88b1c.png)
![](https://img-blog.csdnimg.cn/direct/c18653f0617543b79f7f578fad1c5381.png)
![](https://img-blog.csdnimg.cn/direct/2fd97ab9f60746f9987c89ed9817bfd5.png)
![](https://img-blog.csdnimg.cn/direct/20c75a7883674f78aa8d0f94d4fba818.png)
自定义函数
ret_type fun_name(形式参数){}
函数的举例
#include <stdio.h>
int add(int x, int y)//函数定义中,函数名,后边括号中的参数就是形式参数,简称形参
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d %d", &a, &b);
//调用加法函数,完成a和b的相加
//求和的结果放在r中
int r = add(a, b);//调用函数时,传递给函数的参数就是实参,实际参数
//输出
printf("%d\n", r);
return 0;
}
上述代码中,调用add函数时,传递给函数的参数a和b,称为实际参数,简称实参。 实际参数就是真实传递给函数的参数。
return语句
数组做函数参数
void set_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//写一个函数将arr数组的内容全部改成-1
int sz = sizeof(arr) / sizeof(arr[0]);
set_arr(arr, sz);
//写一个函数将arr数组的内容全部打印出来
print_arr(arr, sz);
return 0;
}
嵌套调用和链式访问
嵌套调用
#include <stdio.h>
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))//判断是否为闰年
return 1;
else
return 0;
}
int get_days_of_month(int y, int m)
{
int days[] = { 0, 31,28,31,30,31,30,31,31,30,31,30,31 };
//下标为0 1 2 3 4 ...
int day = days[m];
if (is_leap_year(y) && m == 2)
day += 1;
return day;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d %d", &year, &month);//2024 1
int day = get_days_of_month(year, month);
printf("%d\n", day);
return 0;
}
链式访问
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//43 2 1
return 0;
}
函数的声明和定义
单个文件
//判断⼀年是不是闰年
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
int main()
{
int y = 0;
scanf("%d", &y);
int r = is_leap_year(y);//函数的调用
if (r == 1)
printf("闰年\n");
else
printf("⾮闰年\n");
return 0;
}
多个文件
![](https://img-blog.csdnimg.cn/direct/c367b16e1b894346b6946fbbfa9068c7.png)