一、一维数组
1.定义:数据类型 数组名[数组元素个数] = {1,2,3};
2.变长数组(伪):数组元素个数可以改变的数组叫变长数组
实现: int a ; scanf("%d",&a); int arr[a]; 数组大小会随着输入的内容进行修改
3.练习:随机产生十个学生的学号(100以内),用户输入学号后判断在数组中是否存在,如果存在则打印出位置。(day03/02findStudent.c)
二、二维数组
1.二维数组:在一维数组中插入一维数组,每个以为数组中的元素都是一维数组。
2.格式: 数据类型 数组名[行数][列数] = {值};
例子: int arr[3][5] = {1,2,3};
3.理解: (int ARR[3]) arr[3] = {1,2,3}; 只可以这么理解
int arr[3][3] = {1,2,3}; //3行3列
4.下标: 数组元素中,行下标= 行数 -1
列下标 = 列数 -1
5.初始化方式:
int arr[3][2] = {1,2,3,4,5,6}; 全部初始化
int arr[3][2] = {1,3}; 部分初始化,没初始化的默认是0
int arr[3][2] = {{1},{3,2},{4,1}} 第一行1和0,第二行3,2,第三行4,1分组初始化
int arr[ ][2] = {1,2,3,4,5,6,7} ; 缺省初始化,默认是4行,第四行是7和0
6. 三维数组:int arr[2][3][4] ;
5.补充:fflush(stdout); //清空输出缓冲stdout. 其中stdin是输入缓冲
练习: 有5个学生,每个学生都有语数外的成绩,请输入学号和科目(0~2),打印出学生的成绩。(成绩随机生成)(day03/04findDoubleArr.c)
三、函数
1.函数:对某一部分重复代码进行封装,方便使用,增加代码的模块化。
2.格式:返回值类型 函数名(参数)
{
函数体;
}
3.注意: 如果没有返回值用void代替,如果没有参数可以空着也可以用void代替
函数内部不可以定义函数,必须放全局。
如果不写返回值类型也不写void则默认是int返回值。
4.参数:调用者给被调用者传递值
格式:返回值类型 函数名(数据类型 变量名,数据类型 变量名){ }
实参:实际参数,在内存中存在。比如main函数中的变量
形参: 形式参数,函数调用前没有内存存储形参,只是形式。
所有形参都是实参的拷贝。
练习:请写一个函数,交换两个变量的值,然后再main中打印交换后的值,在函数中打印交换后的值。(day03/07change.c)
注意:形参改变,不会影响实参的值,他们在不同的内存控件。
5.局部变量和全局变量
局部变量:定义在局部,在某一个括号中的变量(小括号,大括号)
全局变量: 定义在全局,没有定义在某一个括号中
6.作用域和生命周期
作用域: 变量可以使用的范围,局部变量一般在某一个括号中,空间角度
生命周期:变量从在内存中存在到内存中释放的时间。时间角度
7.局部变量和全局变量的区别
生命周期的区别:
全局变量的生命周期:从程序运行到整个程序结束
局部变量的生命周期:从定义开始到括号结束。
作用域的区别:
全局变量:在整个项目中都可以使用,不限于当前文件
局部变量:从定义开始到大括号结束。
8.静态变量和常量
常量:不可以修改的量。用const修饰。 const int x = 123; 则x=234错误。
静态变量:在变量前加static。
全静态变量:全局静态变量不会修改生命周期,但把作用域限定在本文件中。
局部静态变量:局部静态变量作用域不变,生命周期从定义开始到整个程序结束吗,局部静态变量只会初始化一次。
8. 注意:在同一个作用域内不可以有相同的变量名
在不同的作用域内可以有相同变量,如果全局变量和局部变量名相同时,优先使用局部变量,就近原则。
全局变量只有一份,如果某个位置修改了全局变量的值,其他地方全部修改。一般情况下避免使用全局变量。
9.返回值
作用:函数执行完代码后,把结果反馈给调用者。
格式: int fun(int x){ return xx;}
注意:如果有返回值类型,就必须加return关键字;
return只可以返回一个值,例如 return x,y;是错误的。
函数遇到return 则结束,后面的代码不会执行。
如果返回值是void,可以使用return;结束函数。
函数在使用前需要申明,如果没有申明会隐式声明成int返回值和int参数
练习:请在main函数中输入一个行数和列数,通过调用函数返回杨辉三角对应的值。(day03/08return.c)
10.main函数的参数
格式: int main(int argc,char* argv[ ]);
参数: argc是参数的个数,argv是参数的内容。char* 表示字符串,[ ]字符串数组。
补充:
#include
int atoi(const char *nptr); 把字符串转换成int
long atol(const char *nptr); 把字符串转换成long
long long atoll(const char *nptr); 把字符串转换成longlong
如果需要把某一个类型转换成其他类型,直接在前面加上转换后的类型加小括号 int x = 10; float y = (float)x;这个叫强制类型转换。
在32位系统中,long是4字节,longlong是8字节,在64位系统中,long是8字节,longlong也是8字节。
11.递归函数(明天讲)
12.可变长参数(明天讲)
13.函数指针(回调函数) (明天讲)
五、字符串:
1.字符串:字符串是由双引号括起来的,以\0结束的一串字符
2. 字符串常量: “abc” , 每个字符串后默认会添加'\0', ascii是0
3.表示方式:
char arr[10] = {'a','b','c'}; 部分初始化后面的部分是0,而\0的ascii是0
char * arr = "abcasg"; 指针表示方式。
char arr[] = "abcde";
4.字符串的长度包含\0,字符串的有效长度不包含\0,%s打印字符串。
5.字符串函数:
1>字符串不可以使用==比较,strcmp
#include
int strcmp(const char *s1, const char *s2);
作用: 比较两个字符串是否相同
参数:s1 第一个字符串
s2 第二个字符串
返回值:如果相同返回0,如果第一个大返回正数,第一个小返回负数
返回值是第一个字符串中不相同的字母ascii值减去第二个字符串不同的字母的sacii。
2> 计算字符串的长度 strlen
size_t strlen(const char *s);
作用:得到字符串的有效长度,不含\0
参数: 需要计算长度的字符串
返回值:返回字符串的有效长度
3>字符串的拷贝 strcpy
char* strcpy(char *dest, const char *src);
作用: 把stc中的内容拷贝到dest中
参数: stc 源字符串
dest是目的字符串,dest只可以用数组的表示方式
dest必须有足够的空间存放stc的内容,比如说stc是“acd”,则dest中数组必须有4个元素。
返回值:拷贝后的dest的首地址,dest字符串。
作业1:自定义函数实现strcpy功能。
作业2: 在终端输入 ./a.out 1 + 2 ,打印出3.但需要用函数实现。
预习:结构体,枚举联合 宏定义 头文件 条件编译 makefile gdb