语法笔记

文章发布时间:

最后更新时间:

文章总字数:
1.6k

预计阅读时间:
6 分钟

C/C++

1.%p可以用于输入或输出对应的地址,以十六进制输出。

2.int *p,qint* p,q 是一样的,只有 p 是指针变量,q 是 int 类型变量。

3.数组变量本身表示地址,所以这样是正确的 int a[10];int *p=a; 无须 & 也可以。但对于数组的单元仍需要取地址符。且 a==&a[0]

4.[] 既可以对数组用也能对指针用,如果指针指向的只是一个变量也可以这么写,因为可以看成是一个长度为 1 的数组。故只有 p[0] 有意义。

5.* 既可以对数组用也能对指针用,且

6.数组变量是 const 的指针,所以不能被赋值。int a[]<==>int * const a=...

7.如果 const 在 * 前面,如 ,那么对 *p 的修改是不合法的,但仍可以对 x 修改或让 p 指向其他变量。

8.如果 const 在 * 后面,如 ,那么让 p 再指向其他变量是不合法的,仍可以对 x 修改或对 *p 修改。

9.void f(const int *x) 这种写法在传入的参数比地址还大,例如传一个结构体,这种做法可以用较少的字节数传递值还能避免对外面变量的修改。

10.sizeof 得到的是字节数,还要除以该类型占的字节数才能得到数组长度。

11.遍历数组用 *p++ 常数更小,++ 的优先级比 * 高,故会先取出 p 所指的数据,然后 p 挪到下一个位置。

12.0地址不能做任何事,不能读也不能写,为了避免野指针可以先赋 *p=NULL

13.free只能还申请来的地址的首空间。

14.字符数组不等于字符串。字符串末尾自带一个 \0,会占一个位置。

15.你直接写一个 "hello" 这种字符串都是常量,它是一个地址而不是一个量。如果写 char *s="hello" 那么这个字符串会存在只读区域,所以 s[0]='a' 这种修改操作不合法,因为本质其实是 const char *s。如果写 char s[]="hello",那么这个字符串会存在可读写区域,是可以修改的,但是不能有 s="world" 这种操作,因为 "world" 是一个地址,如果是前面那个指针倒是可以这么做。

16.scanf读到空格,tab或回车为止。scanf是不安全的,因为不知道读入内容长度。%7s 那个数字表示最多·允许读入字符数量,包含那个 \0

17.如果这么写 char *s;scanf("%s",s); 是不对的,必须先把那个指针设为 NULL,不然也不能用。

18.以vscode为例,一个项目就是一个里面有.vscode配置文件的文件夹。与OI不同,项目的文件是很多的,所以要专门建个文件夹管理。

19.以C为例,一个.C文件是一个编译单元,编译器每次编译只处理一个编译单元。编译前IDE可以将所有.C文件构建为一个然后再编译。

20.头文件里可以放函数原型,全局变量声明,宏定义,类型定义,但没有定义。用头文件不是引入库,本质还是文本替换。现在的C语言编译器默认引入所有标准库。

21.头文件的 “ ”和 <> 的区别:前者先找当前文件夹再找编译器指定目录,后者直接找指定目录。

22.给函数或者变量加上 static 那么它就只能在当前编译单元使用。

23.extern用于变量声明写头文件里可以相当于给项目里所有编译单元都声明一遍。声明是不产生代码的东西如函数原型,各种声明,inline函数,而定义会产生代码。

24.为了避免头文件嵌套导致的重复声明,需要有标准头文件结构。

25.printf的结构有 %[flags][width][.prec][hIL]type,flags有 - 意为左对齐,+ 意为在前面放正号或负号,(space) 意为正数留空,0 意为用0填充。这个要结合后面两个使用。width或prec,填一个数意为输出一共占几位(如果有小数点小数点也占一位),* 意为下一个参数是占几位,. 后面加一个数字意为小数点后的位数,.* 意为下一个参数是小数点后的位数。例如 printf("%*d",6,123) 那个6就是占几位的参数。hIL意为修饰类型,hh 意为char,h 意为short,l 意为long,ll意为long long,L意为long double。type为类型,id 为int,u为unsinged int,x为十六进制,X为字母大写的十六进制,f或F为六位小数的float,e或E为指数,g或G为float,a或A为十六进制浮点数,c为char,s为字符串,p为指针,n为读入或写出的个数

26.scanf的结构有%[flag]type,flag有hh 意为char,h 意为short,l 意为long或double,ll意为long long,L意为long double,数字为最大字符数,* 为跳过。type有 d为int,i为整数(可以额外接受八进制或十六进制),u为unsigned int,o为八进制,x为十六进制,a,e,f,g为float,c为char,s为字符串,[…]为所允许的字符,p为指针。例如输入为 //$GPRMC,004319.00,A,3016.98468,N,12006.39211,E,0.047,,130909,,,D*79,可以写 scanf("%*[^],%[^],%[^],%[^],%[^],%[^],sTime,sAV,sLati,&sNW,sLong,&sEW,sSpeed,sAngle,sDate);

27.scanf返回值为读入项目数,printf返回值为输出字符数

28.C的文件输入输出和C++的不一样,C用的是fopen,用的时候再查吧。

29.二进制文件和二进制读写,这是不是能卡常用?

30.与可以用来1.让某一位或某些位为0 2.取一个数中的一段 因为在按位与下,我这一位是1,那么结果就是你的那一位,我这一位是0,那么结果就是0;或可以用来:1.让某一位或某些位为1 2.把两个数拼起来 因为在按位或下,我这一位是1,那么结果就是1,我这一位是0,那么结果就是你的那一位

31.位段