1.名字与内存位置之间的关联并不是硬件所提供的,它是由编译器为我们实现的。硬件仍然通过地址访问内存位置。
2.指针变量的值就是一个数字。
3.如果变量是静态的那么会被初始化为0,如果是自动的那么根本不会被初始化。
4.int *a;
*a = 12;
会导致a的初始值是一个非法地址,会导致终止程序。
在unix系统上这个错误被称为段违例或内存错误,他提示程序试图访问一个并未分配给程序的内存位置。
或者还有一种情况,这个指针可能偶尔包含了一个合法的地址,位于那个位置的值被修改,虽然你无意修改。
5.NULL指针作为一个特殊的指针变量,表示不指向任何东西。要使指针变量为NULL,可以给他赋一个零值。为了测试一个指针变量是否为NULL你可以将它和零值进行比较。
6.对一个NULL指针进行解引用操作是非法的,在对指针进行解引用之前,必须确保它不是NULL指针。
7.对一个NULL指针进行简介访问会访问内存位置0.
8.指针变量可以作为左值是因为他们是变量,而不是因为他们是指针。
9.C的规则:所有参数都是传值调用,但是如果被传递的参数是一个数组名,并且在函数中使用下标引用该数组的参数,那么在这个函数中对数组元素进行修改实际上修改的是调用程序中的数组元素,函数将访问调用程序的数组元素,数组并不会被复制。这个行为被称作传址调用。
10.标量参数传值调用,数组参数在行为上就像是它们通过传址调用的那样。
11.ap是一个指针
ap[0] 等价于 *(ap+(0))
12.2[array] 等价于 (2+(array)) 和 (array+2)相同,即array[2]
13.指针比下标更有效率,前提是它们被正确地使用。
14.声明数组参数用:
int strlen( char *string );
一维数组形参无需写明它的元素数目,因为函数并不为数组参数分配内存空间。
15.matrix[1][5] 就是 *(matrix[1]+5)
16.matrix[3][10] matrix是一个指向整型数组的指针。
int (*p) [] = matrix;
当某个整数与这种类型的指针执行指针运算时,它的值将根据空数组的长度进行调整(也就是与0相乘)int (*p) [10] = matrix; 和 int *p[10];
左边是定义了一个指向整型数组的指针p 右边是定义了一个指针数组
19.指针求差:求出两个元素之间的距离,差值的单位和数组类型的单位相同。