一、数据类型
1.1 字符类型
字符型变量使用关键字 char 进行定义,一个字符型变量占用1字节大小的空间。 一个字符常量存放到一个字符型变量中时,实际上并不是把该字符的字型放到内存中,而是把该字符的ASCI码值放到存储单元中,打印字符型变量时,如果以字符形式打印,那么计算机会到 ASCII 码表中查找字符型变量的ASCII码值对应的字符。
1.2 字符串
字符串型常量是由一对双引号括起来的字符序列。例如,"How do you do。"、"CHINA"、"a"和 "$12345"是合法的字符串型常量,我们可用语句 printf("How do you do.")输出一个字符串,但要注意的是,'a'是字符型常量,而"a"是字符串型常量,二者是不同的.
例如,如果先用语句 char c 定义字符型变量c,后令 c="a"或 c="CHINA",那么这样的赋 值都是非法的,原因是不可以将字符串型常量赋值给字符型变量。
C语言中没有定义字符串型变量的关键字,只能使用字符数组来存储字符串,在每个字符串型常量的结尾加一个字符串结束标志,以便系统据此判断字符串是否结束,C语言规定以字符 '\0' 作为字符串结束标志例如,字符串型常量"CHINA"在内存中的存储结果如下图所示,它占用的内存单元不是5个字符,而是6个字符,即大小为6字节,最后一个字符为'\0'.然而,在输出时不输出'0,因为\0'无法显示。
字符串型常量"CHINA"在内存中的存储结果
1.3 字符数组
字符数组一般用来存取字符串。通常采用的初始化方式是 char c[10]="hello"。因为C语言规定字符串的结束标志为"\0",而系统会对字符串常量自动加一个"\0",为了保证处理方法一致,一般会人为地在字符数组中添加"\0",所以字符数组存储的字符串长度必须比字符数组少1字节。例如,char c[10]最长存储9个字符,剩余的 1个字符用来存储"\0"。
二、数据的输入输出
2.1 输入
当scanf输入整数、浮点数、字符串时会忽略\n、空格等字符,而输入字符类型%c时不会忽略。
所以当控制台输入 1 1.2 a abc时想要原样输出,scanf要为 scanf("%d%f %c%s")
2.2 输出
printf代码格式:
不同的%codes表示不同的变量类型,也可以限制变量的长度。
位于%和格式化命令之间的一个整数被称为最小字段宽度说明符,通常会加上空格来控制格式:
- 用%f修饰符指定想要的小数位数。例如,%5.2f会至少显示5位数字并带有2位小数的浮点数。
- 用%s修饰符简单地表示一个最大的长度,以补充句点前的最小字段长度。
printf 函数的所有输出都是右对齐的,除非在%符号后放置了负号。例如,%-5.2f 会显示5位字符、2位小数位的浮点数并且左对齐。
2.3 进制转换
10进制(123)转2进制(1111011):123不断除以2,把余数写在左面,用商继续迭代除。
2进制(1111011)转10进制:从低位往高位(右->左)不为0的位置上的值 * 2次幂相加依次计算,2^0 + 2^1 + 2^3 + 2^4 + 2^5 + 2^6 = 123,二进制中不为0的位置上的值为1,可省略。
16进制(7b)转10进制:11 * 16^0 + 7 * 16^1 = 123
2.4 gets和puts
gets函数可读取一行,当需要读取到空格不被scanf识别为结束标志时使用。
puts函数只能输出字符串,同时多打印一个换行符。
三、malloc与free
malloc与free都在头文件stdlib.h包下
在链表等数据结构中,由于无法得知要存储多少数据,所以只能通过动态分配空间的方式来开辟堆内存空间(类似Java的new),在使用时,malloc并不知道我们申请的空间用来存放什么类型的数据,所以要自己进行类型转换,申请成功时,函数返回值是一个指向新分配空间内存的起始位置;失败时返回null。
malloc一般搭配sizeof(获取对象内存大小)使用,当要动态开辟20个int类型空间时:(int*)malloc(sizeof(int) * 20)
在使用完malloc后,要及时释放空间 free(指针对象),此时最好也将指针对象赋值为null,防止二次调用。
注意:在malloc和free之间,申请空间的指针对象不能进行偏移等改变值的操作,原因是申请一段堆内存空间时,内核帮助我们记录的是起始地址和大小,所以释放时内核用对应着的首地址进行匹配,匹配不上时,进程就会崩溃。