读书笔记,记录于此,温习之用。
1.void 真正发挥的作用在于:
(1)对函数返回的限定
(2)对函数参数的限定
注:在C99标准中main()函数的返回值默认为int型
2.sizeof的真实面目:
sizeof是关键字,而并不是有些常认为的的函数,只不过是其长的像而已,那么怎么检验这一说法了?只需在编译器中用sizeo i;即可,编译器通过,则证明确实如此,因为函数后面没有括号是不行的。
这里面有几个题目容易混淆的:
int a[100];
sizeof(a) ;//100,因为a代表的是一种数据结构;
sizeof(a[100);//4,数组中的第一百个元素,为int型
sizeof(a[0]);//4;同上
sizeof(&a);//4,取数组的地址
sizeof(&a[0]);//4,去第一个元素的地址;
int b[100];
void fun(int b[100])
{
sizeof(b);// sizeof (b) 的值是4;//函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个 //指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
}
3.return
起作用是用来结束函数和返回其后面跟的值;
return //直接结束函数,跳到函数外 ;
return 0//代表函数正常终止;
return 1//代表函数非正常终止;
注意:return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
4.const(虽说是常量修饰符,但是其实质是只读变量。const修饰的变量一定要赋初值,)
const int *p; // p 可变,p 指向的对象不可变
int const *p; // p 可变,p 指向的对象不可变
int *const p; // p 不可变,p 指向的对象可变
const int *const p; //指针p 和p 指向的对象都不可变
记忆方法如下:“近水楼台先得月”,去掉类型之后 ,看const离谁最近。第一个离*p最近,代表的是指向的变量,多以变量不可变,指针可变,同理可得其他的。
还有,记住一句话,const 修饰的只读变量不能用来作为定义数组的维数,也不能放在case 关键字后面。
5.遇到一题:int i0;index==(i++)
题中先判断index==i==0的,相当于(index==i)·····i++;
6.#define PCHAR char*
PCHAR p3,p4;
注意,这里的p4并不是代表一个char型指针,而是一个char类型的字符。
7. 转移字符:\与后面跟的字符之间没有空格,切记,加空格之后无意义
8.||和&&:
int i=0,j=0;
if ((++i)>0||(++j)>0)
{
cout<<i<<" "<<j<<endl;
}
其中的i=?,j=?正确答案是1,0;这样换成&& 也很清楚答案是1,1了;
9.另一种两个数交换的方法:
a^=b;
b^=a;
a^=b;
当然这只是一种方法,就程序的易读性而言是不好的。
10.关于左移和右移运算
正数的左右移都是一样的,按照给定位数移动,其余位补零;
负数则要分情况:
1)负数的原码在移位时符号位保持不变,其余位补零
2)负数的反码保持符号位不变,移位后其余位补1
3)负数的补码分两种情况:第一,右移时,符号位保持不变,其余位补1;第二,左移时,符号为保持不变,其余位补0;
由于负数在计算机里面存储的是补码形式,所以,在写程序时所谓的右移左移都按照补码的操作来。当然,这只是算数右移和左移的情况,至于逻辑移位操作,请参考相关资料