C语言中的各种小知识点(自己做的笔记)

由于学习上和工作中对C语言用的比较多,但是手头上又有很多工作要做,不可能随时记得住,所以以此为笔记,衡而记之。(实时更新)只写浅显的结果,不写原理!对于工程人员来说,大部分情况是够用的。

 

关注公众号,获取更多信息

 

1、sizeof()与strlen()的区别

sizeof()用于计算变量或者数据类型的内存容量的函数。怎么理解这个变量和数据类型呢?变量就是值可以变的量,在计算机中就是一段连续的内存(实际上是一些物理内存碎片,这里说的是虚拟内存)。简单一点,数据类型就是诸如int,char等。这个函数返回的结果单位是字节。'\0'包括在内。
strlen()用于计算给定字符串的长度。百科中有说明,就是一个计数器,从字符串的某个位置开始,遇到'\0'结束,所得到的个数,'\0'除外。举几个例子:

------------------------------

char *str1="abcde";
char str2[]="abcde";
char str3[8]={'a','b','c',''d};
char str4[] = "0123456789";
int a[5]={1,2,3,4,5};
++++++++++++++++++
sizeof(str1)=4 (计算的是变量str1内存,而str1是个指针)

sizeof(*str1)=1 (*str1是第一个变量,而类型是char,所以是1)

sizeof(str2)=6 (a,b,c,d,e,\0)=6*sizeof(char)
sizeof(str3)=8 (str3已经被定义为长度为8的数组)
sizeof(str4)=11 (0,1,2,3,4,5,6,7,8,9,\0)

sizeof(a)=5*4=20 (依赖于int,一个int占用4个字节)

--------------------------------------------
char a1[12];
char a2[3]={'\0'};
char a3[14]="12345"
++++++++++++++++++++++

strlen(a1)=不定。(怎么去计数呢?)

strlen(a2)=0 (一个开始就结束了)
strlen(a3)=5 (很难说,争议比较大。)
--------------------------------------------

2、数组和指针的区别

这部分参考了《C专家编程》的内容。(很多人把数组和指针等同)
相当于编译的时候,指针也有一个地址,在用的时候,去这个地址取指针,而指针代表的是地址,然后再去这个地址拿数据。
特殊的一个例子:
void func(char str[100])

 

{
........
}

sizeof(str) = 4 (实际上就是指针的大小,因为在传递时候是传递地址,写不写后面的100是无关紧要的。)

所以也可以写成:

void func(char* str){...} 或者 void func(char str[]){...}

3、宏定义(编译过程中预处理)

参考我的另外一篇博客《 C/C++从main()函数开始梳理的一些知识点(普及小贴)》。宏定义在编译的预处理过程中会有替换。
例如,定义一个常量
#define   PI   3.1415926
定义一个函数

#define  MIN(x,y)  ((x<y)?x:y)

4、数据的声明

直接用这篇博客:http://blog.jobbole.com/109117/

5、volatile关键字

主要作用是保证数据读取的准确性。当对变量做修饰之后,每次读取变量的值,都会从变量的地址处拿值(这一点跟我们通常理解的读取变量值是一样的)。因为有些情况下,需要对变量做频繁的数据修改,同时也是告诉编译器,这个变量的值是要随时都会更改的,不要对代码做优化。

6、const和static的区别

参考我的另外一篇博客《 静态变量(static变量)和常量(const 类型)

7、 位操作

8、数据类型计算过程中的转换

9、各个数据类型所占用的字节

32位编译器:

指针:4 个字节
int:4个字节
unsigned int:4个字节
short:2个字节
unsigned short:2个字节
float:4个字节
double: 8个字节
long: 4个字节
long long: 8个字节

unsigned long: 4个字节

char:1个字节

10、如何判断某个值是否为0

对于bool类型:FALSE是0, TRUE是1,所以可以直接判断(if(TRUE))
对于int类型:int n; if( n == 0)
对于float类型:if (|x| < 0.000001)

对于空类型:NULL = 0

11、内存对齐(以结构体和联合体为例)

内存对齐主要是为了提升计算机的效率。例如32位机,如果采用了内存对齐,当程序执行的时候,会每次读取一定长度的数据来处理,而不用管到底是哪一个。内存对齐的大致原理如下(个人的理解):(bool变量不考虑内存,就是不计算)

(1)结构体的第一个成员的首地址偏移量是0

(2)结构体中每个成员的地址偏移量是 这个成员的大小(所占字节数)的整数倍

(3)整个结构体的大小是结构体中成员长度的最大值的整数倍,哪里不够在哪里补充。

这个是什么意思呢,举两个例子。

struct A

{

      char   a;

      char   b;

      int c;

}

第一个成员的偏移量是0,

第二个成员的偏移量应该是这个成员长度的整数倍,由于其长度为1,所以其偏移量是1

第三个成员的偏移量应该是这个成员长度的整数倍,由于其长度为4,所以其偏移量是4

那么第三个成员和第二个成员之间的空隙怎么办呢,系统去补空位

此结构体的总长度是最大成员的长度的整数倍,通过前面的分析,可以看到结果是8个字节

用下图来表示

如果结构体中还有结构体呢?

 

 

12、动态输入字符(不知道字符个数)

自己写了一个程序,可直接运行。上图

13、函数的参数传递

14、字符串常量和字符串变量

字符串常量:在一个双引号内的字符串序列或者转义字符组成。例如“DDD\n”, "abc"等。字符串常量存储在静态内存里面,是不能被改变的,如果试图通过指针访问的形式来改变的话,就会出现错误。所以,在定义字符串常量的时候加上const。例如下面的形式:
const char* str = "abc";

而str[1] = 'd' 或者 *(str+1)='d' 都是错误的。

字符串变量:C语言中字符串变量是通过数组的形式来表示的。例如:char str[] = "i love you"; 或者 char str[20] = "i love you"等。那么这个时候就可以通过数组访问的形式改变值了。例如:

str[3] = 'm'

15、strcpy(),strlen()函数

这里主要讨论长度的问题。
strlen(str)计算字符串长度时,是不包含结尾处的'\0'
strcpy(str1, str2) 会copy str2中的'\0'到str1中
strcmp(str1, str2) 字符串从左向右逐个字符相比较(ASCII值),直到出现不同的字符,或者遇到'\0'。
strcat(str1,str2) str2的字符串会添加到str1的后面,同时会覆盖str1后面的'\0', 最后会自动在str1的后面添加'\0'。

16、指针的一些知识点(包含如何用绝对地址去调用函数)

17、程序运行时的内存组织和分配(结合开发经验和所学,现卖)

 

 

18、一个循环链表的例子(1到N数数,数到M就剔除)

 

 

19、

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值