《C和指针》读书笔记整理
2011-09-10 07:51 onm 阅读(472) 评论(0) 编辑 收藏 举报笔记是5个月前写在一个破本上的,现在整理一下,很多地方或字迹模糊,或丢失上下文,不知道写的神码玩应,删了好多。
整理的好处是,终于可以把那个破本扔了,这个才是我的终极目的。
#include<> 会在相应位置展开相应文件。
sizeof 是标识符,不是函数。
#if 0
statements
#endif
从逻辑上删除一段代码
不能把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是字符本身。
int* a看上去更为清楚,a被声明成int*类型的指针,但是这并不是一个好技巧,因为int* a,b,c;(这样b,c其实是int型而不是指针)
int const *pci; const int *pci; 整形常量
int * const cpi; 常量指针;
c语言中,static放到函数前面,是使函数作用域在文件内,而不是静态函数。
指针存的是地址
一个变量的值,就是分配给这个变量的内存位置所存储的数值。
传址是为改变地址的内容,而指针本身内容不变,指针存地址。
xxx* p; sizeof(p) = 4; 指针是4个字节,32bit,存一个地址。
int *a; *a = 12; 究竟a指向哪里呢?声明了变量,但未对它初始化,所以没法预测12这个值将存在什么地方。指针变量和其他变量并无区别,如果变量是静态的,它会被初始化为0,但如果是自动的,它根本不会被初始化。不会创建用于存储整形值的内存空间。如果程序执行赋值操作,会发生什么情况呢。如果你运气好,a初值会是个非法地址,将出错,终止程序,在UNIX上,成“段违例”或“内存错误”,更为严重的是这个指针偶尔可能包含一个合法地址,接下来很简单,那个位置的值被修改!
值的类型并不是值的内在本质,而是取决于它被使用的方式。
数组名的值是一个指针常量,在程序完成链接之后,内存中数组的位置是固定的。
只有两种场合下,数组名并不用指针常量来表示,就是当数组名作为sizeof操作符或单目运算符&的操作数。sizeof返回整个数组长度,而不是指向数组指针的长度。去一个数组名的地址所产生的是一个只想数组的指针,而不是一个只想某个指针常量值的指针。
为什么下标检查在C中是一项困难的任务,这项任务之所以困难,因为下标引用可以作用于任意的指针,而不仅仅是数组名作用与指针下表引用的有效性既依赖于该指针当时恰好指向什么内容,也依赖于下表的值。
char message[] = "hello"; 与 char *message = "hello"; 不一样。前面的message是'h'的地址,而后面的message是字符串常量"hello"的首地址的地址。
c中,多维数组的元素存储顺序按照最右边的下表先变化的原则,称为行主序。
以前写过个《C指针那点事#1》,也放这里了,没那次写的感觉了。