6.1名字与内存:高级语言特性之一就是通过名字而不是地址来访问内存位置,名字就是我们所称的变量,名字与内存之间的关联并不是由硬件所提供,它是由编译器为我们实现的。
6.2 未初始化和非法指针:
下面这个代码段说明了一个极其常见的错误:
int*a;
*a= 12;
这里声明创建了一个名叫a的指针变量,后面那条语句把12存储在a所指向的内存位置。
【警告】:但是究竟a指向哪里了?我们声明了这个变量,但为对它进行初始化,所以我们没办法预计12存储在哪里。
【错误报告】:在unix系统上,这个错误称为“段违例(segmentation voilation)”或“内存错误(memory fault)”。在windows系统上,这个错误提示是:保护性异常(General Protection Exception)。
6.3 NULL指针:
1.表示不指向任何东西。要想一个指针变量为NULL,你可以给它赋一个零值。
2.对NULL指针进行解引用操作时非法的。
6.4 左值(L-value)和右值(R-value):左值就是出现在赋值符号左边的东西。右值就是出现在赋值符号右边的东西。指针可以作为左值,并不是因为它是指针,而是因为它是变量。
6.5 指针常量:
*100 = 12;//这条语句是非法的,因为100是整型,间接访问必须是指针类型的表达式。
如果想实现25存储于位置100. 必须强制类型转换:
*(int *)100 = 25;
6.6 指针的指针:
int a = 12;
int *b = &a;
int **c = &b;
它们在内存的模型如下: