输出函数 各种占位符
%d ->int
%ld ->long int
%c ->char
%f ->float,默认保存小数点后6位。(在%.数字f,百分号与占位符中间位置修改默认保留位数)
%u ->无符号整形数(范围:0-255)
%hu ->无符号短整形(范围:0-127)
%hd ->短整形
%lf ->double 默认保存小数点后6位。
%x ->十六进制输出
%o ->八进制输出
%s -> 字符串
%g ->跟%一样,差别是不保留小数后无用的0
%lg ->跟%lf一样,差别是不保留小数后无用的0
补充:
\r 回车字符,会把光标重新挪到本行第一位,覆盖本行已经打印的内容。
\r必须与\n一起使用,可避免出问题。
C中没有String类型,但可以用Char char[] 表示,结束标志是\0
输入函数
格式:scanf("占位符",“内存地址”);
不管是输入,还是输出函数,占位符都在前面的引号里,内容都在后面的引号里!!!
指针
格式:某种类型*,例如:int* p,定义一个int类型的一级指针变量。
理解:指针就是内存地址,即内存地址编号。
操作:赋值 -> int i=10; p=&i, 指针p指向i的地址;
取值 -> int j; j=*p,把指针p指向的地址的内容取出来;
**本值和地址没关系,各司其职而已。值:负责数字,地址:负责位置。
指针和指针变量的区别:
指针里存的是100,指针:地址--具体;
指针里存的是地址,指针:指针变量--可变;
指针的重要性:
1、可直接访问硬件(opengl显卡绘图);
2、可快速传递数据(指针表示地址);
3、可返回一个以上的值(返回一个数组或者结构体的指针);
4、可表示复杂的数据结构(结构体);
5、可方便处理字符串;
6、可有助于理解面向对象;
*号的三种位置:
3*5 数学运算符;
int* p 定义指针变量;
*p 取内存地址为p的里面的数字;
对于交换值的错误认识:
面向过程,只有拿到数值的地址,才能真正拿到该数值;
只操作了地址,仅仅说明地址上下交换了,但是内容还是在地址里面,也跟着交换了。
正确做法:拿到地址后,操作数值交换,就能实现真正交换。
返回多个值:
void close(int* a,int* b){ }
通过被调用的函数,来修改主调函数中普通变量的值。
1、实参必须是普通变量的地址;
2、形参必须是指针变量;
3、被调用的函数中必须通过修改 *形参名的方式修改主调函数相关变量的值;
多级指针
定义:
例如:int i=10;
int* p1=&i; 一级指针,存放的i的内存地址;
int**p2=&p1;二级指针,存放的p1的内存地址;
int ***p3=&p2;三级指针,存放的是p2的地址;
。。。反正存的就是地址!!!
取值:
int j=***p3; 或者 int j=**p2; 或者 int j=*p1;
与存的顺序相反;
网友评论