1.格式符%x输出不带0x
%#x这样会带0x
2.int a=6;
scanf("%c",&a);
printf("%c",a);
输出的是6;
3.ASCIi中
65大写A
4.sprintf(a,"%d",i);
int sprintf(char *str, const char *format, ...)
str -- 这是指向一个字符数组的指针,该数组存储了 C 字符串
format -- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,
5.逗号运算符
- 逗号表达式从表达式1开始顺序从左向右执行;
- 其逗号表达式最后的值为最后一个表达式的值;
- 逗号运算的优先级最低,也就说明与其他运算符结合使用的时候,在没有括号的情况下逗号运算符最后才执行。
eg:z=(x%y,x/y),这个中z=x/y;和前面没啥关系。
z = (x=5,y=6,x+y);
z赋值为11,x赋值为5,y赋值为6;
6. sizeof 计算 所占空间的大小
strlen 求字符串长度"\0"之前的字符个数
7.%p,用来打印地址
指针
指针的字节,占位
32位的无论什么类型数据都是4个字节
64位的是8个字节
做题中遇见的积累
1.一项正一项负可以用三目操作符
2.输出是哪一天就直接使用switch
如何用if判断闰年,用flag,flag=0或1;
flag=1&&month>2 +1
3.如果想要比较循环中前后俩个的值
如何保存前一个的值呢,就是在最前面找另一个变量给他保存一下,就是在那个要改变的前面
4.兔子繁殖问题(斐波那契数列)
可以俩个俩个输出
比如
int a=1,b=1;
for(i=0;i<10;i++)
{
printf("%d,%d",a.b);
a=a+b;
b=b+a;
}
第二种
int a=1,b=1,c=1;
for(i=3;i<10;i++)
{
a=b+c;
b=c;
c=a;
printf("%d",a);
}
4.一个多位数可以放在一个数组中作为字符
但是记得表示的时候用'1',记得加单引号
5.sprintf函数
int a[100];
l=sprintf(a,"%d",i);
用于将i以%d的形式写进a中,a一般是数组,i可以是数字,字母,数组都可以
这个函数的头文件就是#include<stdio.h>
返回值是字符串的长度
可以用于找字符串长度
6.>>
右移
在带符号的移位中,无论正数还是负数,移位后符号不变,数值变化:
正数:左移右移都补0;
负数:原码左移右移都补0,
反码左移右移都补1,
补码左移补0,右移补1;
">>>"表示无符号右移,也叫逻辑右移,
即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
">>"是指:向右移位,如果该数为正,则高位补0,若为负数,则高位补1;
">>"是指:向右移位,如果该数为正,则高位补0,若为负数,则高位补1;
7.& 代表 “按位与”
保留二进制位置相同的数
| 代表 “按位或”
即两个数中间只要有1的位置,在按位或之后,同位置值为1
8.字符串数组
如果用单引号,不会加\0
但是如果是双引号,就会有\0
1.
#include<stdlib.h>
stdlib.h中,包含了C语言的一些常用库函数
包括动态储存的,随机函数等,如果还有宏定义
2.在定义单链表结点类型时,使用struct LNode *next来定义指向下一个结点的指针是因为在C语言中,结构体类型的定义需要在使用之前进行声明。在这个结构体中,struct LNode是自定义的结构体类型,而*next是该结构体类型中的一个成员变量,它的类型是指向struct LNode类型的指针。
为了在结构体中使用自身类型的指针,需要先对该类型进行声明。使用struct LNode *next的方式可以确保在定义结构体时,struct LNode已经被声明过,从而可以正确地使用该类型。
如果不使用struct LNode *next的方式,而直接使用LNode *next,则会导致编译器无法识别LNode这个类型,因为在定义该结构体之前并没有对其进行声明。因此,为了避免编译错误,需要使用struct LNode *next来明确指定指针的类型。
在定义中相当于typedef struct LNode LNode;
typedef LNode *LinkList;