1. 什么是指针:
指针是一个变量,系统会为指针分配内存空间,指针有自己的地址,并且能够存地址。
2. 指针的算术运算:
(1)指针加减一个整数:
如果一个指针指向的是一个数组,如:
int a[10], *p;
*p = a[5];
那么对p + 1就是加一个数组元素,加的是四个字节,使它指向下一个元素。同理,p - 1是使它指向上一个元素。要注意的是对指针进行加减操作时不要越界,越界可能会导致操作失败。
(2)指针-指针
当两个指针指向的是同一个数组中的元素时才允许进行这种操作;两个指针相减的结果是两个指针之间相差的数组元素个数,即两指针在内存中的距离,此距离以数组元素为单位。
值得注意的是如果两指针指向的不是同一数组,那么它们之间相减的结果是无意义的,同样的两指针相加的结果也是无意义的。
3.指针的关系运算:
对指针执行关系运算也是有限制的,用 < 、> 、>= 、<= 的前提是它们都指向同一数组元素。但是对任何指针都是可以进行相等或不相等的测试,所得的结果是相等或不相等。
4.常量指针与指针常量的区别:
(1)常量指针,如
const char *p;
此语句定义的是一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,但指针本身是可以修改的,如 *p = ‘4’;它试图改变指针指向内容的值,而此值是常量不可修改,故此语句是非法的;但 p = &‘4’是可以的,指针可以指向不同的地址。
(2)指针常量,如
char* const p = &a;
这条语句定义的是一个指针常量,即指针本身是常量,不可修改,但指针指向的内容是可以修改的,即 *p = ‘a’,这是可以的,但 p = &b 就是非法的,不可以的。
5.NULL 总是被定义为0吗?
NULL不是被定义为0就是被定义为(void*)0,因为一个纯粹的0和一个void 指针都能被自动的转换成任何所需类型的指针。
6.NULL总是等于0吗?
如果是与比较的结果的话,NULL确实总是等于0,这也是空指针定义的本质所在;但如果指的是其存储方式和整型值的话,答案是不,NULL并不必须被存为一个整型值0。
7.空指针有何用处?
(1)用空指针终止对递归数据结构的间接引用;
(2)用空指针作为进行函数调用失败时的返回值;
(3)用空指针作为标志事物结尾的一个特定值。
8.任何时候都可以用其他指针代替void指针?
是的任何时候都可以用其他类型的指针代替void 指针或用void指针代替其他类型的指针。当进行纯粹内存操作时,或传递一个指向未定类型的指针时,可以使用void指针,void指针也常用作函数指针。
9.函数指针与指针函数的区别:
(1)函数指针:指向这个函数的指针,定义为 : 数据类型 (*fun)(参数列表),如 int (*fun)();
(2)指针函数:返回值是指针的函数,定义为: 数据类型 *fun(参数列表), 如 int *fun().
10.typedef有何妙用?
例如,要定义用法函数指针 int (*fun)(int*, int*),但每次都这样定义会很麻烦,可以用typedef来声明一个新的定义,即函数指针可以如下定义:
typedef int (*FUN)(int*, int*);
FUN fun;