二维数组
int arr[常量][常量]
初始化
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int arr[3][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
初始化时,只能省略行不能省略列
int arr[][5] = {[1,2],[3,4],[5,6]};
有:1 2 0 0 0
3 4 0 0 0
5 6 0 0 0
int main()
{
int arr[3][5] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
int i = 0;
for(i=0;i<3;i++)
{
int j = 0;
// for(j=0;j<5;j++)
// {
// printf("%d",arr[i][j]);
// }
// printf("\n");
// }
// return 0;
//}
//1 2 3 4 5
//6 7 8 9 10
//11 12 13 14 15
//
//int main()
//{
14
// 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;
//}
//打印二维数组的地址
//int main()
//{
//for(i=0;i<3;i++)//行
// {
// int j = 0;
// for(j=0;j<5;j++)//列
// {
// printf("&arr[%d][%d] = %p\n",i,j,&arr[i][j]);
// }
// printf("\n");
// }
// return 0;
//}
//二维数组在内存中也是连续存放
// 二维数组是一维数组的数组arr[0][j],arr[1][j]
//可以将arr[0]看成数组名
//
//数组
//c语言在创建数组的时候,数组大小的指定只能使用常量,常量表达式。
//C99 中引入了变长数组的概念,数组的大小可以使用变量来指定
//但是VS默认是不支持C99中的变长数组,变长数组是不能初始化的。
//Dev-C++环境中
//#include<stdio.h>
//#include<stdlib.h>
//int main(int argc,char*argv[])
//{
// int k = 0;
// scanf("%d",&k);
// int arr[k];
// int i = 0;
// for(i=0;i<k;i++)
// {
// arr[i] = i+1;
// }
// for(i=0;i<k;i++)
// {
// printf("%d",arr[i]);
// }
// return 0;
//}
//编写代码,演示多个字符从两端移动,向中间汇聚。
//int main()
//{
// char arr1[] = "welcome to bit!!!!!";
// char arr2[] = "*******************";
// size_t left = 0;
// size_t right = strlen(arr1)-1;
// while(left<=right)
// {
// arr2[left] = arr1[left];
// arr2[right] = arr1[right];
// printf("%s\n",arr2);
// Sleep(1000);//休眠,单位是毫秒
// system("cls");
// left++;
// right--;
// }
// printf("%s\n",arr2);
// return 0;
//}
//找练习
// 牛客网 洛谷
//
//二分查找----在有序(升序和降序)数组中
//int main()
//{
// int arr[] = {1,2,3,4,5,6,7,8,9,10};
// int k = 7;
// int i = 0;
// int sz = sizeof(arr)/sizeof(arr[0]);
// for(i = 0;i<=sz;i++)
// {
// if(arr[i] == k)
// {
// printf("找到了,下标为:%d\n",i);
// break;
// }
// }
// if(i == sz)
// printf("找不到\n");
// return 0;
//}
//
//
对半
//int main()
//{
// int arr[] = {1,2,3,4,5,6,7,8,9,10};
// int k = 0;
// scanf("%d",&k);
// int sz = sizeof(arr)/sizeof(arr[0]);
// 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",i);
// flag = 1;//找到了
// break;
// }
// }
// if(flag == 0)
// printf("找不到\n");
// return 0;
//}
//函数
// 类型 函数名(形式参数)
// {
//
// }
//
//写一个加法函数,完成2个整形变量的加法操作
//int Add(int x,int y)
//{
// int z = 0;
// z = x + y;
// return z;
//}
//int main()
//{
// int n1 = 0;
// int n2 = 0;
// scanf("%d%d",&n1,&n2);
// int r = Add(n1,n2);
// printf("%d\n",r);
// return 0;
//}
// 或
//int Add(int x,int y)//x,y为形参,只是形式上存在的,不会向内存申请空间,不会真实存在。对形参的修改不会影响实参
//int Add(int x,int y)
//{
// return x + y;
//}
//int main()
//{
// int n1 = 0;
// int n2 = 0;
// scanf("%d%d",&n1,&n2);
// int r = Add(n1,n2);//n1,n1为实参
// printf("%d\n",r);
// return 0;
//}'
形参的名字可以和实参的个数相同。
return 0;就是将0返回给调用main函数的那个函数。
return后面可以什么都没有,但这种写法适合函数返回类型是void的情况
rerurn返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型。
main 函数中返回0表示正常返回,返回非0值表示异常返回。
数组作函数参数
#include<stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
set_arr();//设置数组内容为-1;
print_arr();//打印数组内容
return 0;
}
假设我们的计算某年某月有多少天?
31 28 31 30 31 30 31 31 30 31 30 31
29
is_leap_year 函数判断闰年,如果是闰年返回1,不是返回0.
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[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
int d = days[m];
if(is_leap_year(y)&&m == 2)
d+=1;
return d;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d%d",&year,&month);
int day = get_days_of_month(year,month);
printf("%d\n",day);
return 0;
}
或
int is_leap_ year(int y)
{
return((y % 4 = 0)&&(y % 100!=0))||(y % 400==0));
}
int get_days_of_month(int y,int m)
{
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
int d = days[m];
if(is_leap_year(y)&&m == 2)
d+=1;
return d;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d%d",&year,&month);
int day = get_days_of_month(year,month);
printf("%d\n",day);
return 0;
}
int is_leap_ year(int y)
{
return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
或
#include<stdbool.h>
bool is_leap_ year(int y)
{
return (((y % 4 = 0)&&(y % 100!=0))||(y % 400==0));
}
int get_days_of_month(int y,int m)
{
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}
int d = days[m];
if(is_leap_year(y)&&m == 2)
d+=1;
return d;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d%d",&year,&month);
int day = get_days_of_month(year,month);
printf("%d\n",day);
return 0;
}
int is_leap_ year(int y)
{
return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
链式访问
//正常
#include<stdio.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n",len);
return 0;
}
链式
#include<stdio.h>
int main()
{
printf("%d\n",strlen("abcdef");
return 0;
}
int main()
{
printf("%d",printf("%d",printf("%d",43)));
rerurn 0;
}
解释
printf("%d",43);的返回是43
由于43有两位数字组成,故printf("%d",printf("%d",43));返回的是432
又由于2由一位数字组成,故为1,printf("%d",printf("%d",printf("%d",43)));打印的是4321
函数一定要满足:先声明后使用
int is_leap_ year(int y)
{
return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
int main()
{
int year = 0;
sacnf("%d",&year);
if(is_leap_ year(year))
printf("闰年\n");
else
printf("不是闰年\n");
return 0;
}
如果代码是这样
int main()
{
int year = 0;
sacnf("%d",&year);
if(is_leap_ year(year))
printf("闰年\n");
else
printf("不是闰年\n");
return 0;
}
int is_leap_ year(int y)
{
return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
则会报错
正确的是
//函数声明
int is_leap_ year(int y)
int main()
{
int year = 0;
sacnf("%d",&year);
//函数调用
if(is_leap_ year(year))
printf("闰年\n");
else
printf("不是闰年\n");
return 0;
}
//函数定义
int is_leap_ year(int y)
{
return ((y % 4 = 0)&&(y % 100!=0)||(y % 400==0));
}
函数的声明通常放在头文件,函数的定义通常放在.c文件,在main函数声明格式为:#include"***.h"
//导入静态库
#pragma comment(lib,"add.lib")
static和extern
作用域 类似于局部变量
生命周期 变量从创建到结束 也与局部变量类似
举例
#include<stdio.h>
void test()
{
int a = 5;
a++;
printf("%d",a);
}
int main()
{
int i = 0;
for(i = 0;i < 5;i++)
{
test();
}
return 0;
}
结果为:6 6 6 6 6
若加入static修饰局部变量
#include<stdio.h>
void test()
{
static int a = 5;
a++;
printf("%d",a);
}
int main()
{
int i = 0;
for(i = 0;i < 5;i++)
{
test();
}
return 0;
}
结果为:6 7 8 9 10
结论: static修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,
本来一个局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。
存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,
只有程序结束,变量才销毁,内存才回收。但是作用域不变的。
如果外部文件1为;int g_val = 2024;
文件2为:
int main()
{
printf("%d\n",g_val);
return 0;
}
若要使用外部文件:
则:
extern int g_val = 2024;//声明
int main()
{
printf("%d\n",g_val);
return 0;
}
如果外部文件为:static int g_val = 2024;
则无法使用
因为:如果有static修饰的文件,那只能在本文件使用。
即:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。