《算法笔记》第2章笔记(二)
1、给整个数组都赋初值0:
int a[10] = {0};
int a[10]={};
使用memset函数,memset建议只用来赋值0或-1。
用法:添加string.h头文件,之后memset(数组名,值,sizeof(数组名))
#include<stdio.h>
#include<string.h>
int main(){
int a[5] = {1,2,3,4,5};
memset(a,0,sizeof(a));
return 0;
}
2、 如果数组大小较大(大概106级别),则需要将其定义在主函数外面,否则会使程序异常退出。 因为函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
3、在字符数组的末尾都有一个空字符\0,以表示存放的字符串的结尾。
空字符\0在使用gets或scanf输入字符串时会自动添加在输入的字符串后面,并占用一个字符位,而puts和printf就是通过识别\0作为字符串的结尾来输出的。
4、字符串函数(在string.h头文件里)
- strlen()得到字符数组中第一个\0前的字符的个数
- strcmp()返回两个字符串按照字典序的比较结果
- strcpy(字符数组1,字符数组2)把字符数组2复制给字符数组1
- strcat(字符数组1,字符数组2)把字符数组2拼接到字符数组1后面
5、sscanf和sprintf
想把字符串转化成int类型:
int n;
char str[100] = "123";
sscanf(str,"%d",&n);
把int类型转化成字符串:
int n = 123;
char str[100];
sprintf(str,"%d",n);
6、全局变量:定义在之后所有函数之前,定义后的所有程序段内都有效的变量。
局部变量:定义在函数内部,且只在函数内部生效,函数结束时局部变量销毁。
7、函数的参数可以是数组,但是返回类型不能是数组。
参数中数组的第一维不需要填写长度,如果是二维数组,那么第二位需要填写长度。实际调用时只需要填写数组名。
与普通的局部变量不同,数组作为参数时,在函数中对数组元素的修改就等同于是对原数组元素的修改。
8、指针变量
int* p;
int a;
p = &a;//指针变量p指向变量a的地址
//*p和a的值是相同的
*p = 233;//a也是233
a = 122;//*p也是122
9、指针和数组
在C语言中,数组名称也作为数组的首地址使用,因此a == &a[0]
又因为指针变量可以进行加减法,因此a+i等同于&a[i]
*(a+i)等同于a[i]
- 两个int型的指针相减,等价于求两个指针之间相差了几个int(结果不是以字节为单位,而是以int为单位)
10、指针与函数
能够使main函数里的数据发生变化的只能是函数中对地址指向的数据进行的修改,对地址本身进行修改没办法对数据产生影响,因为函数传递的是值,只是地址的副本。
11、引用
在函数中,不使用指针,也能达到修改传入参数的目的:使用引用。
引用不产生副本,而是给原变量起了个别名,对引用变量的操作就是对原变量的操作。
引用的使用方法:
在函数的变量名前面加个&就可。
由于引用是产生变量的别名,因此常量不可使用引用。
12、结构体
struct studentInfo{
int id;
char gender;
char name[20];
}Alice,Bob,str[1000];
其中,studentInfo是这个结构体的类型名,Alice、Bob、str是结构体变量。
结构体不能定义自身,但可以定义自身类型的指针变量。
struct studentInfo{
int id;
char name[20];
studentInfo* next;
}stu,*p;
访问时可以用“.”操作和"->"操作,如stu.id,stu.name,stu.next,(*p).id,(*p).name,(*p).next。
C语言中对访问结构体指针变量内元素更简洁的写法:p->id,p->name,p->next。
13、结构体的初始化:使用构造函数
构造函数不需要写返回类型,且函数名与结构体名相同。
struct studentInfo{
int id;
char gender;
studentInfo(){}
studentInfo(int _id,char _gender){
id = _id;
gender = _gender;
}
}
14、黑盒测试
(1)while…EOF型
while(scanf("%d",&n)!=EOF){
...
}
while(scanf("%s",str)!=EOF){
...
}
while(gets(str)!=NULL){
...
}
(2)在多点测试中,每一次循环都要重置一下变量和数组,否则在下一组数据来临的时候变量和数组的状态就不是初始状态了。重置数组一般使用memset函数或fill函数。