何为指针(原创)
以下是本人对指针的一点浅薄理解:
例子1 :
int* Ptr; 我们这样理解,*Ptr是一个int型变量,*Ptr的意思是把变量Ptr的值当地址使用。简单一句,Ptr是一个地址,根据这个地址可以存取一个int型变量。Ptr是一个int指针。
例子2:
int* Array[3];
Array[3]是一个有三个元素的数组,每个元素都作地址使用,按这个地址可以存取一个int型变量。简单一句,Array[3]是一个由三个int指针组成的数组。
例子3:
int* Function()
Fun()是一个无参函数,它的返回值被当作地址来使用,根据这个地址可以存取一个int型变量。简单一句,Function()是一个返回int指针的无参函数。
对指针最基本的用法作了一个回顾之后,现在我们来尝试对指针和数组的共同点和不同点来作一个简要的分析:
A:相同点:
1:指针和数组的名字都代表某种类型的变量地址。
2:编译器赋予Array[i]与*(Array + i)相同的解释,即运算符[]与*是等价的。
3:指针与数组名在作函数参数时,完全等同。For example: int Function(int Array[]); 和 int Function(int* Array)是完全等同的。
B:不同点:
1:指针是变量,编译器为指针分配地址空间,且指针的值可以在运行时随时改变。数组名相当于一个常量,编译器不会为数组名本生分配空间,而且不能修改数组名的首地址。
关于B(1)的不能修改数组首地址之例外情况的思考:当数组名作参数时,参数被压入栈,数组名相当于有了自己的存储空间(栈内),于是就可以象修改指针一样修改(栈内)数组之名。
关于前一段时间一帖谈到“数组根本不存在,只有指针”的话题,本人支持这个观点:
理由1:在函数参数中,指针是完全可以替代指针的。For example: int Function(int Array[]); ---> int Function(int* Array);又如,int Function(int Array[][i]); ---> int Function(int (*Array)[i]);
理由2:不作参数时,一维数组完全可以用一个指针来实现。int Array[3] = {0, 1, 2};等同于int* Array = new int(); *(Array) = 0; *(Array + 1) = 1; *(Array + 2) = 2;一维数组就可以这样用指针来实现。当然最后别忘了delet[] Array;
理由3:不做参数时,二维数组也可以用指针来表示,这是又二维数组的特性决定的。int Array[5][6]; 假定&Array[0][0] == XXX;则&Array[2][2]为XXX + (4 * 5) * 2 + 4 * 2 == XXXX + 48.所以,同理按理由2的方法,可以用指针来替代二维数组。如果再仔细想想,也能用指针来实现三维、多维数组。