C语言部分基础知识

1.尽量缩短变量的定义范围。例如,在for循环初始化部分定义循环变量

2.循环次数不确定,而且n也不是“递增”式的循环最好采用while循环

3.变量在未赋值之前的值是不确定的。注意是不确定,它不一定等于0或NULL

4.比较大的数组应尽量声明在main函数外

5.数组,字符串(字符数组)不是“一等公民”,不能用“=、==、<=、+”等运算符。字符串可以使用strcpy(),strcmp(),strcat()等函数来执行“赋值”,“比较”,“连接”等操作

6.scanf不会读取 空格、Tab、回车符

7.条件运算符遵循“短路机制”。表达式1?表达式2:表达式3,当表示式1成真时,表达式3不会计算;反之,表达式2不会计算

8.复合赋值运算符最后会赋值,改变变量的值

9.switch(常量整型),case 常量整型:

10.函数srand()的功能时初始化随机数发生器,即设置随机数种子,若随机数种子相同,则程序每次运行时函数rand()产生的随机数是一样的,通常用time(NULL)的返回值作为随机数种子。如果要产生[m,n]范围内的随机整数,可用表达式rand()%(n-m+1)+m求得。

11.memset()函数初始化非char类型数组最好只用这两个: -1 0

12.函数可以嵌套调用但不能嵌套定义

13.* 与 ++ 优先级相同;[ ]、()比 * 优先级高

14.静态全局变量对其他源文件不可见,而全局变量对其他源文件可见;局部静态变量只在定义它的函数内有效;静态变量、全局变量有专门的静态储存区,区别于一般的动态变量

15.宏是用标识符来替换字符串;用#undef来提前终止宏的作用范围;宏可以嵌套定义;定义有参宏时,宏名与形参表的圆括号之间不能有空格,其后的字符串内的形参最好都用括号括起来

16.在进行强制类型转换时,得到的是一个所需的中间类型,原来的变量的类型并未发生变化

17.*p++ 即先得到p所指向的变量(*p),再使p=p+1; *++p:先使p指向后一个变量再取值

18 返回指针的函数:类型名 * f(int ,int )

19 指向函数的指针:类型名 (*p)(int i,int j),p指向的函数两个整型参数,函数返回类型由类型名决定;不能对指向函数的指针做任何运算;指向函数的指针可以通过同类型的函数名(参数与返回类型相同)、函数指针或NULL来进行初始化或赋值

20 int *p[]--------这是个数组元素都为int指针的数组,数组名p是一个二级指针

21 int (*p)[5],p是一个指针,指向含有5个元素的一维数组

22 const int *p,p是指向常量的指针,不能通过p改变所指对象的值;int *const p,p是指针常量,值不能被改变

24 char a[20], 数组名a始终指向数组中第一个元素,其值不可改变。而在函数定义中,如void fun(char b[]) 等价于 void fun(char *b),它的值可以改变,即可以指向其他字符变量

25 字符数组每个元素存放一个字符,而字符串指针存放的是字符串首地址,不是将字符串存放到字符串指针中

26 在64位机器中,一个指针是64位,即8字节。可用sizeof获得其值

27 int a[5]。 a+1 与&a+1含义完全不一样

28 已知数组名a,求数组长度:sizeof(a) / sizeof(a[0])

29 int (*a[5])(int,int)定义一个数组,每个数组元素都是一个函数指针

30 以#开头的预处理命令不是C语言的一部分

31 左移的时候一定是补0,数a左移n位相当于a * 2 ^n;右移当左边最高位为0时补0,为1时,根据系统补1 或 0,数a右移n位相当于 a / 2 ^n

32 ifndef…define…endif… 的含义:如果未定义/那么定义/完成定义。 一般是用来防止头文件被重复包含,提高编译效率。

33 read、open等是Unix/Linux系统的库函数,属于系统调用,而fread、fopen等是C语言封装了系统调用后方便程序员使用的C标准库函数。

34 无符号数可以取到零,但是取不到负数

35 int a=1,b=32. 当执行a<<b时,编译器会先将b与31进行&操作,以限制左移的次数小于等于31. b&31== 0,则a<<b==1. 若是直接执行1<<32 操作会得到0.

36 带标签的语句是一种特殊的语句,在语句前面有一个标识符(即标签)和一个冒号。使用goto lable就可以跳到标签处执行。switch case语句中的case就是一种标签。

37 初始化指针时,所创建的字符串常量被定义为只读,如果试图通过指针修改这个字符串的值,程序就会出现错误。如:char * s=“AAA”; s[0]=‘B’;这种语句就是非法的。

38 class A{}; 一个空类,虽然不包含任何信息,但是必须在内存中占一定的空间,否则无法使用这些实例,一般sizeof(A)的值为1。

39
(1)结构体和联合体都是有多个不同的数据类型成员组成,但是在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同,从低地址开始公用);
(2)对于union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是相互不影响的。
(3)联合变量占有的内存空间是该联合变量中占有最大内存空间的成员在内存对齐时所需的存储空间。

40
(1) malloc函数:void* malloc(unsigned int size)
在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。

(2) calloc函数: void* calloc(unsigned int num,unsigned int size)
按照所给的数据个数和数据类型所占字节数,分配一个num*size连续的空间。calloc申请内存空间后,会自动初始化内存空间为0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。

(3) realloc函数:void* realloc(void *ptr,unsigned int size)
动态分配一个长度为size的内存空间,并把内存空间的首地址赋给ptr,把ptr内存空间调整为size。申请的内存空间不会进行初始化。

(4)new(C++)是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。
静态分配是指在编译阶段就能确定大小,由编译器进行分配。堆不可以进行静态分配,堆的申请都是在执行过程中进行的。
堆是使用malloc()、calloc()、realloc()等函数动态分配的,而使用alloca函数可以动态分配栈的内存空间,释放的时候由编译器自己释放。

41 二维数组作为参数时,必须给定列数。如果我们省略了第二维的大小,编译器将不知道如何正确的寻址。

(32~40均参考了以下博主的内容,我只是整理到一起)
原文链接: https://blog.csdn.net/liujiayu1015/article/details/59492707

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值