读《C和指针》笔记摘要【3】

来源:互联网 发布:青蛇 知乎 编辑:程序博客网 时间:2024/05/17 03:26

2010-04-08


38、+,-,*,/,%

除了%操作符,其他全部既适用于浮点型,又适用于整型类型,当‘/’操作符的两个操作数是整数时,它执行整除运算,否则执行浮点数除法;


39、位操作符(右移>>,左移<<),两个操作符都必须是整型类型;


40、a<<-5,这是一种未定义形式,其结果由编译器决定;


41、指定位置1:Value = Value | 1 << bit_number;

       指定位置0:Value = Value & ~(1 << bit_number);

       检测特定位的值为1还是为0:Value & 1 << bit_number;

42、计算一个值中值为1的位的个数:

int Count_one_bits( unsigned Value )

{

int ones;

for( ones = 0; Value != 0; Value >> 1)

if(( Value & 1) ! = 0)

++ones;

return ones;

}


43、下面这段代码包含一个潜在的问题:

int a = 5000;

int b = 25;

long c = a*b;

问题在于表达式a*b是以整型进行计算,在32位整形数的机器上,这段代码运行完全没问题,但是在16位的整数的机器上,这个乘法计算会产生溢出,这样C就得到一个错误的值;


44、当整型值转换为float型纸时,也有可能损失精度,float型值仅仅要求6位数字的精度。如果将一个超过6位数字的整型值赋值给一个float型变量时,其结果可能是该整型值的近似值;


45、左值和右值:左值是个表达式,它可以出现在赋值符左边,它表示计算机内存中的一个位置,右值表示一个值,所以它只能出现在赋值符的右边,每个左值表达式同时也是个右值,但反过来就不对了,例如:a = b + 5;


46、有符号值的右移位操作是不可移植的;


47、变量在内存中存储,内存中的指定字节包含了一序列内容为0或者1的位,他们可以被解释为整数,也可以被解释为浮点数,这取决于他们被使用的方式,如果使用的整型算术指令,那么值就被解释为整数,其他也一样;


48、通过一个指针访问它所指向的地址的过程称为间接访问或解引用指针;


49、&操作可以取出相应变量的内存地址,但除对声明为register变量外,其余都有用,因为register是存储在寄存器里而不是内存里面;


50、指针数组以一个NULL指针结束;


51、两个指针相减的结果的类型是ptrdiff_t,是一种有符号整数类型,相减的值是两个指针在内存中的距离,(是以数组元素的长度为单位,而不是以字节为单位,因为减法运算的结果将除以数组元素类型的长度);


52、for( vp = &Value[N_Value - 1]; vp >= &Value[0]; vp--)

*vp = 0;

上面这个程序存在一个未定义操作:标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与指向数组第一个元素之前的那个内存位置的指针进行比较;


53、声明一个指针变量并不会自动分配任何内存;


54、NULL指针就是不指向任何东西的指针;


55、除了NULL指针之外,再也没有任何内建的记法来表示指针常量;


56、函数的定义即函数的实现;


57、尾部递归可以很容易地改写位循环的形式,改后的效率通常还要高一些;


58、单一的值称为标量,数组是个集合,指针是一个标量值,数组名的类型是“指向某类型的常量指针”;


59、取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针;


60、声明一个指针变量时,编译器只是为指针本身保留空间,它并不为任何整型值分配内存空间;


61、数组的初始化方式类似于标量变量的初始化方式——也就是取决于它们的存储类型;


62、静态数组未被初始化,数组元素的初始值将会自动设置为零;


63、char message[] = "hello";//这个方式是错误的;

char *message = "hello";//这个方式是正确的;

后者是一个真正的字符串常量,这个指针变量被初始化的指向这个字符串常量的存储位置;


64、matrix[4, 3] == matrix[3];

两个形式相同,但不提倡第一种;


65、int matrix[3][10], *mp = matrix;

上面这个是错误的,类型是不匹配的!!mp是一个指向整型的指针,而matrix是一个指向整型指针的指针;


66、int (*p)[10]; p 是指向整型数组的指针;


67、在编写一维数组形参的函数原型是,你既可以把它写成数组的形式,也可以把它写成指针的形式,但是,对于多维数组只有第一维可以这样选择;


68、多维数组初始化时,只有第一维才能根据初始化列表缺省地提供, 剩下的几维都必须显式提供;


69、int a[][3] = {1, 2, 3, 4, 5, 6, 7, 8};// 这是不允许的,因为无法得出第一维的维数;

int a[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8}}; //这样是可以的,可以读书第一维的维数;


70、指针和数组并不相等,数组的属性和指针的属性大相径庭,当我们声明一个数组时,它同时也分配了一个内存空间,用于容纳数组元素,但是,当我们声明一个指针时,它只分配了用于容纳指针本身的空间;


71、数组形参既可以声明为数组,也可以声明为指针,这两种声明形式只有当他们作为函数形参是才是相等的;


72、一个程序80%的运行时间用于执行20%的代码,所以其他80%的代码的语句对效率并不是特别敏感,所以使用指针获得的效率上的提高抵不上其他方面的损失;



原创粉丝点击