转自这里
数据类型
1.
int add = 0x123456789;
int p = (int)add;
Q:add是什么,add里装了什么,p是什么,p里装了什么,*p是什么,&p又是什么
A:add 是一个整型变量,add里面是0x123456789的二进制数;p是一个整型指针变量,p里面是0x123456789的二进制数,不过是以地址的方式表现出来,代表地址0x123456789;p 是通过去访问地址0x123456789这个地址数据(若试图去打印,会出错,这个地址不一定有权限去访问);&p是取出整型指针变量p的地址。
2.
#define PI 3.14
(1)
int a = PI;
printf("%d
", a);
(2)
printf("%d
", PI);
Q:代码有没有问题
A:
(1) a 为整型变量,PI为宏定义的一个常量,3.14赋给a,可打印,结果为3
(2)在预处理阶段被替换成“printf(“%d
” , 3.14)”,结果为1374389535,浮点型的3.14在内存中的数据是以整型表现的
3.
const的只读功能,可以定义const常量,具有不可变性
便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。例如: void f(const int i) { ………} 编译器就会知道i是一个常量,不允许修改
可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。
可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 还是上面的例子,如果在函数体内修改了i,编译器就会报错
提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
4.
Q:形参与实参的区别
A:
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使
实参出现在主调函数中,进入被调函数后(必须有确定的值),实参变量也不能使用
形参就是函数定义时候用的,实参是在函数调用时候用的
形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量
形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
5.
全局变量(外部变量)的使用方法
int a,b;
void f1()
{
….
}
float x,y;
{
….
}
int main()
{
….
}
a,b,x,y都在main主函数之外定义,所以都为外部变量,即全局变量;但x,y定义在函数f1之后,f1内对x,y无说明,所以在f1内无效;a ,b定义于源程序最前面,所以在f1 ,f2, main 中不加说明也可使用
6.
n位的数据类型范围为什么为 -2^(n-1)~2^(n-1)-1
负数的-号无法存入内存,所以规定:将基本数据类型的最高位腾出来,用来存符号,最高位为1 为负数,最高位为0 为正数
但为什么正数的范围会-1,因为要平均分配负数与非负数。
二进制的最小数确实是1111111111111111只是二进制补码的最小值才是1000000000000000而补码的1111111111111111是二迚制值的-1
7.
#define p_str2 char *
p_str1 s1, s2;
p_str2 s3, s4;
上述变量定义中,s1, s2 , s3 都被定义为char * ,s4 则定义了char ,不是我们所预期的指针变量,根本原因是#define只是简单的字符串替换而typedef则是为一个类型起新名字
8.
char 1
short 2
long 4
int 4
float 4
double 8
9.
修饰函数
extern是全局变量声明
只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)
若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下
例如 #include “my_Fun.c”
extern int b;//b是在my_Fun.c中声明了的一个全局变量
这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)
这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了
10.
地址常量与地址变量
数据存储的空间中的数据可以被修改,这个空间称为变量,如果空间中的数据不能被修改,这个空间称为常量。地址常量就是地址不能被修改,就像一维数组中的数组名,是一个指针常量,不可被运算和不可被改变。地址变量就是地址能修改,就像一级指针,是一个指针变量,可以通过移动下标或移动指针来改变。