1、C语言程序程序代码:九九乘法表;(输出的内容由程序代码控制)
编写结果:
基本数据类型的结构框架图:
基本类型:又称非构造性数据类型,其构造简单,是由系统事先定义好的。
构造类型:又称复杂数据类型,一般由程序员将其它数据类型(包括构造类型本身)按一定的规则构造而成。
指针类型:指针变量中只能存放地址(指针)。主要用于解决动态数据的建立、删除和使用。
空类型: 主要用于数据类型的转换和定义函数的类型。
C程序中的数据类型有常量和变量之分,分别属于以上这些数据类型。在程序中用到的所有数据都必须先定义后使用。
2、数据类型与存储类型
数据类型:类型名称、存储大小(字计数)、表示范围、内存中的表示(补码),基本操作
存储类型:生命周期、可见范围、占据内存是否释放
3、对于数组的操作(就是对数组元素的操作)
所含数据都是同种类型的;
一个元素一个元素的操作,不存在整体操作;数组名不能作为左值;[ ] 为下标运算符;
a[10]没有用完,需要加 "\0"结束符(人为)
4、变量(可变)
是指:对内存空间的映射(内存地址与变量之间的映射)
直接寻址:访问变量名
间接寻址:访问地址(*p);
const 只读变量
变量的存储类型:
auto :自动;static:静态,(全局数据区);register:(CPU中) 定义的基本数据类型调用到寄存器中,多用于单片机;extern: 声明;
每个进程运行所需的空间称为进程的虚拟地址空间。32位操作系统中该空间大小为4G(2 32次方)。分配方法一在硬盘上开辟虚拟内存空间,二采用软件实现(写时复制),在内存中给每个进程映射。
栈空间:默认值为垃圾值,周期与函数相同,空间固定
堆空间:空间可以扩展
全局数据区:默认值为0;周期与程序相同
txt:代码只读区
全局变量:所有文件都能使用 (全局数据区)
全局静态变量(全局数据区):作用范围局限于它的源文件,即只有本文件内的代码才可以访问它,变量名在其他文件内不可见
局部静态变量(全局数据区):局限于特定函数,但出作用域并不释放,在函数体内的静态变量的值也能够维持
静态函数:作用范围仅限于它的源文件,即只有本文件内才能够调用,函数名在其他文件不可见
存放位置:程序开始时,存放在全局数据区,结束时释放空间,默认初始化值是0,使用时可改变其值;
5、字符类型:char
无字符串类型(c语言 中用数组处理)
字符串的处理需要用到字符数组;
6、short (两个字节) ;int(等于CPU字长(数据总线的条数),可以读的二进制的位数);long(4个字节,32位);long long (8个字节,地址总线)
7、数据类型(数据范围)
1 char
char类型占一个字节
有符号:char或者 signed char
取值范围:-2^7 - 2^7-1 ---> -128 - 127
无符号: unsigned char
取值范围:0 - 2^8-1 --> 0 - 255
2 short
short类型占两个字节
有符号:short或者 signed short
取值范围:-2^16/2 - 2^15-1 ---> -32768 - 32767
无符号: unsigned short
取值范围:0 - 2^16-1 --> 0 - 65535
3 int
int类型占四个字节
有符号:int或者 signed int
取值范围:-2^32/2 - 2^31-1 ---> -2,147,483,648 - 2,147,483,647
无符号: unsigned int
取值范围:0 - 2^32-1 --> 0 - 4,294,967,295
4 long
long类型在32位操作系统占四个字节,在64位操作系统占8个字节
有符号:long或者 signed long
取值范围:-2^64/2 - 2^63-1
无符号: unsigned long
取值范围:0 - 2^64-1
5 float 浮点 10-38~1038
6 double 双精度型 10-308~10308
8、实数不能精确表示0;实数之间的比较用精度(差值)
9、计算机中的表示
整数:用补码表示(不用补码,0就会有两种表示方法)
58 - 100 = 11010110
实数:用 尾数(表示数值),指数(表示小数) 来表示
字符类型:用ASCII码表示
计算机只会做加法
10、sizeof 与 strlen 的区别
s = "hello"
sizeof(s) = 6 ;包含了"\0" (sizeof 求对象在内存中所占的字节数)
strlen(s) = 5; 遇到"\0"就结束;
strlen(a) = 255;
11、\a :报警 响铃(压到键盘);\b:退格; \d :(tab 键);\v :纵向挑格; \r 回车 不换行
\n :换行 ; \f :走纸换页 (打印机); \ddd : (1到3位 8 进制数),\101 表示:'A' 65
\xhh (1到 2位 16 进制) \x41 ‘A’ 65
12、小的类型 放在长的类型中,用最高位扩展,即用符号位补齐。
用7位ASCII码,汉字占两个字节;
13、类型操作
(++ --)用于 int ; (%) 用于 int ; (余数与被除数的正负相同)
14、结构体(struct)与(union 共用体)
结构体:所占空间为所有空间之和;第一个成员的地址也是结构体类型的初始地址;但是成员的指针类型与结构体的不一样
共用体:类型变量不能取成员的地址(内存中才存在地址)
内存:一个字节一个编号(一个单元);整形不能给指针类型赋值;
15、void *p 万用指针(可以转化为其他类型指针用)
16、 typedef 类型定义(重新命名),不生成新类型
17、const 只读变量
18、printf( )函数
功能:向终端输出若干个任意指定类型的数据
格式:printf("格式控制(修饰符)",参数表列);
格式控制:
修饰符:
getch:接受一个任意键的输入,不用按回车就返回。该函数的返回值是所输入字符的ASCII码,且该函数的输入不会自动显示在屏幕上(无回显) 用#include<conio.h>
getche:有返回显示 ;用#include<conio.h>
getch(),getche()没有用到缓冲区。
getchar:从键盘读取一个字符并输出,该函数的返回值是输入第一个字符的ASCII码;若用户输入的是一连串字符,函数直到用户输入回车时结束,输入的字符连同回车一起存入键盘缓冲区.
19、 scanf( )函数
功能:等待用户从键盘上输入数据,然后按格式控制的要求对数据进行转换后送到相应的变量地址中去。
格式:scanf(“格式控制”,地址表列);
注意:数据输入过程中产生的垃圾的处理方法!!
20、优先级
单目运算符 > 双目运算符
算数运算符 > 关系运算符 > 逻辑运算符
21、初始化与赋值
初始化 : int a = 7;
赋值: int a; a = 7;
默认初始化 : 全局变量 为 0; 局部变量为 垃圾值;
人工初始化 : int a ; a = 7;
22、野指针
野指针含义:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针的形成:
指针变量未初始化; 指针释放后之后未置空; 指针操作超越变量作用域;
野指针危害:
野指针很可能触发运行时段错误( Sgmentation fault)
因为指针变量在定义时如果未初始化,值也是随机的。指针变量的值其实就是别的变量(指针所指向的那个变量)的地址,所以意味着这个指针指向了一个地址是不确定的变量,这时候去解引用就是去访问这个地址不确定的变量,所以结果是不可知的
野指针因为指向地址是不可预知的,所以有3种情况:
第一种是指向不可访问(操作系统不允许访问的敏感地址,譬如内核空间)的地址,结果是触发段错误,这种算是最好的情况了。
第二种是指向一个可用的、而且没什么特别意义的空间(譬如我们曾经使用过但是已经不用的栈空间或堆空间),这时候程序运行不会出错,也不会对当前程序造成损害,这种情况下会掩盖你的程序错误,让你以为程序没问题,其实是有问题的。
第三种情况就是指向了一个可用的空间,而且这个空间其实在程序中正在被使用( 譬如说是程序的一个变量x),那么野指针的解引用就会刚好修改这个变量x的值,导致这个变量莫名其妙的被改变,程序出现离奇的错误。工般最终都会导致程序崩溃,或者数据被损害,这种危害是最大的。
野指针的解决方法:
常规的做法是:
第一点:定义指针时,同时初始化为NULL
第二点:在指针解引用之前,先去判断这个指针是不是NuLL
第三点:指针使用完之后,将其赋值为NULL
第四点:在指针使用之前,将其赋值绑定给一个可用地址空间