Day5:
Day6:
%s:字符串
字符串的输出函数:
Printf(“ %s ”, str);
puts(数组名);
功能:将数组中的内容打印到终端,并且自动换行
注意:打印到‘\0结束
字符串的输入函数:
Scanf(“%s”,str);
gets(数组名);
功能:将输入的字符串保存在数组中,并且在末尾自动添加‘\0’
注意:gets不会进行越界检查,如果超出范围,就会操作未申请到的内存空间,段错误
出现段错误的原因:非法操作你没有申请的空间
Scanf和gets的区别:
Scanf写在gets之上时,会出现异常情况(gets吃掉了‘\n’)
- gets以回车作为结束符,但是scanf以空格,回车TAB作为变量输入结束的标志
2、
缓冲区:
Gets在输入结束后,会自动清空缓冲区的内容
Scanf在输入结束后,会在缓冲区中遗留空格、回车、tab
输入:
Gets:进行输入时,回先去检查缓冲区的内容,如果缓冲区有内容,会率先输出缓冲区当中的内容
Scanf:键入,不会检查缓冲区的内容
strlen和sizeof的区别:
- strlen求到的是字符串的实际长度,而sizeof求到的是申请到的内存空间的大小
- Strlen是一个函数,sizeof是一个运算符
Day7:
调用函数的注意事项:
注意:
- 需要将实参的值拷贝给形参,实参的个数以及数据类型要和形参一致
- 实参,可以是变量,常量,表达式,但是必须是一个确定的值
- 实参和形参是两块独立的空间
- 传参,实际上是将实参的值拷贝给形参
- 形参是局部变量,在函数调用时开辟空间,函数调用结束,立即释放
函数声明的作用:
声明:将函数头部直接复制粘贴至main函数之前,然后加上分号
声明的作用:帮助编译器做语法检查
Day8:
指针是一种数据类型,是一种保存地址的数据类型
指向零号地址的指针(值为0的指针,就认为该指针没有指向)
注意:零号地址禁止操作
NULL;
野指针:不知道指向哪里的指针
局部变量,没有初始化,随机值
局部指针变量,如果没有初始化,就是野指针。
1.指针的数据类型:去掉变量名就是数据类型。
2.指针所指向的数据类型:去掉变量名和一个*号。
3.指针所能访问到内存空间的大小,是由指针所指向的数据类型决定。
指针的算数运算:
p+n:p向地址增大的方向移动了n个数据
p实际的变化:p + sizeof(指针指向的数据类型)*n
P-n: p向地址见效的方向移动了n个数据
p实际的变化:p - sizeof(指针指向的数据类型)*n
P++: p向地址增大的方向移动了一个数据 //改变指针的指向
p = p+sizeof(指针指向的数据类型)
P--:p向地址减小的方向移动了一个数据 //改变指针的指向
p = p-sizeof(指针指向的数据类型)
p-q:(p和q数据类型必须相同):这两个指针之间相隔的个数
实际的变化:(q-p)/sizeof(指针指向的数据类型)
//实现数组的输入
//参数1:数组的首地址 int *
//参数2:元素的个数 int
Void input (int *m,int n)
Void input (int m[ ] , int n)
Void input(int m[100], int n)
//当形参为数组时,都当做同级别的指针去用
Day9
一,指针和二维数组的关系:
a[i][j], *(a[i]+j), *(*(a+i)+j)
- &a、a、&a[0]、a[0]、&a[0][0]的值是一样的,但是表达的含义不一样
a:Int (*) [3] :他是一个指向一维数组的指针 a[0]:指向int类型元素的指针
- 为什么说a不是int**类型?
如果a是int**类型,那么他指向的数据类型应该是int * ,那么a+1,应该移动移动4字节,但是a+1,移动了12字节,移动了一个数组,因此a一定不是int**类型
a指向a[0]、a[0]指向a[0][0]
二,数组指针:
概念:指向数组的指针
1.数组指针和一维数组的关系:
a[i], *(a+i), *((*p)+i), (*p)[i]
2.数组指针和二维数组的关系:
a[i][j] p[i][j], *(*(p+i)+j) ,*(p[i]+j), *(*(a+i)+j) ,*(a[i]+j),
三,指针数组:
概念:元素为指针的数组
- 指针数组和一维数组的关系
a[i], p[i] *(*(p+i)) *(p[i])
- 指针数组和二维数组的关系
*(P[i]+j) ,*(a[i]+j)