printf(格式化串,参数…)
格式化:‘%’+格式字符(‘%’+无效字符直接打印无效字符)
要打印 % 需要用连续两个 %
%5.3s
输出为五列,三个字符 所以为(两个空格)+ com
%m.ns
输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧(靠右对齐),左补空格。
if else
匹配,||
运算if和else的配对原则 if else是就近配对的
逻辑或 || ,当 || 左边表达式成立时右边表达式不会执行
*运算符优先级: (后缀++) > (前缀++) > (解引用 ) > (加法+) > (以…加 += )
A:(*p+=1)》 (*p) += 1 》 year += 1
B:(*p)++ 》 year++
C:++ (*p) 》 ++year
D:*p++ 》 (p++) 因为后缀++优先级高于解引用 , 先对p指针进行后置++(后置++,先使用值再自增,效率低于前置++,因为要开辟临时空间,++i可以做左值,i++不行),然后解引用p,对p指针+1。
malloc() / free() 都只会申请释放内存空间,不会改变里面的数据(酒店退房)。
const使用(const int *p,int const *p,和int * const p二)
常量指针:(表示这个指针是一个指向常量的指针(变量)。指针指向的对象是常量,那么这个对象不能被更改。)
const int* p 和 int const *p 等价,const 修饰p指针解引用之后结果,表示p所指向的内容不能改变,只能改变指向(的地址)
指针常量:(本质是一个常量,是指针类型的常量)
int* const p ,const修饰指针p,表示p的指向(地址)不能改变,可以解引用改变指向内容的值
每个成员偏移地址都要对齐; 结构体整体是对齐数的整数倍
结构体内存对齐 (位段、联合union)
位段:(内存对齐!)不支持跨平台
应用:ip数据报头
32位平台long long
占4字节,%d 格式输出4字节
低地址 ————————————> 高地址
0X 01 00 00 00 00 00 00 00
0X 10 00 00 00 00 00 00 00
0X 11 00 00 00 00 00 00 00
printf
是标准库的格式输出函数,开辟函数栈帧(栈向地址减小方向增长);LIFO后进先出,c,b,a入栈存储
二级指针数组,是数组,数组元素是数组的元素是指针,指针所指向的地址是二维数组的地址**(二位数组的一维元素任意,二维必须是4个)**
对&arr+1相当于加整个数组的大小:&arr+1 = arr+sizeof(arr)
p+1就是二维数组加一行,*p+1指向p所指向行数的下一个元素。本题p指向二维字符数组a,二维数组的每行分别是三个字符串一维字符数组,起初p指向第一行morning, p++指向afternoon所在行,由于打印字符串的首地址等于打印字符串,所以打印完整的afternoon,而不是a的首地址
A: 当while循环的条件表达式是赋值语句的时候,其含义为:先执行赋值语句,然后对左值进行判断。(如果输入不是’\n’那(getchar()!=‘\n’)为1,(ch=1)这里赋值,所以还是while还是会执行的)如果左值为0则expr为假,while退出;否则expr为真,while继续循环,所以不会出现死循环,当然这种写法是不标准的编译器会给出警告
D: for循环初始化条件只会一次,然后死循环判断
类斐波那契