首页 > 代码库 > ~指针~

~指针~

指针是c的一大特色,之所以说是一大特色,是它特别的使一群初学者懵逼其中,不能自拔。那么,指针到底是什么呢?俩字----地址。 下面笔者就个人理解叙述一下指针到底是什么,希望对读者的思路有所帮助。

  要理清指针,我们不必像书上那样,文字罗列,看起来极具有学术性和严谨性,我们仅通过几个例子就能说明。

1.

  技术分享

这定义了一个指向int型的一级指针标量变量。  请注意这句话,int型是它的基类型,一级指针是它的级数,变量说明它可以重新赋值。且指针变量的名为a。

2.

  技术分享

 这个指针变量p经过赋值运算,已经指向了a变量。p中存储的是a的地址,且为起始地址。

 3.

技术分享

引用这个元素怎么办?请看,第五行和第六行是等价的。即*p和a是等价的,都是10。系统是先从p找到a的起始地址,根据sizeof(int)取出4个字节(或2,编译器而异),从而得到a的值。

4.

技术分享

数组名a本身就是一个指针,一维数组名为一个一级地址,a有两层含义:1)代表整个数组 2)代表整个数组的起始地址,也是a【0】的起始地址。

p也是一个以及地址,经过p=a;p就指向了数组。a是常量,p是变量。

5

技术分享

注意,8,9,10行是等价的;11,12,13行是等价的。

也就是说:

a[i]<=>*(p+i)<=>*(a+i);

p+i<=>a+i<=>&a[i].

 

6二维数组

技术分享

这里定义一个3*4的二维数组,a是数组名,是一个二级地址;a的含义是第0行第0列元素的首地址。

再定义一个指针p,p显然是一个一级指针,那么,p=a;这个语句显然就不合法。

注意,这时,a[0]还是元素吗?答案是no,a[0]也是一个地址,是一级地址,它是第0行第0列元素的首地址。【或者说,a是一个行指针,a[0]是一个列指针。】

对于a和a[0]的区别和联系,做以下总结,可以使清晰明确:

a+i<=>&a[i] 二级地址;

*(a+i)<=>a[i] 一级地址;

*(a+i)+j<=>a[i]+j 一级地址;表示第i行第j列元素的首地址;

*(*(a+i)+j)<=>a[i][j]; 元素值;

那么,想要定义一个二级指针p,使得p=a;语句合法,应该怎么做呢?

应该这样定义:  int (*p)[4];  这是一个指针,p指向有4个int元素的一维数组;关于指针数组,在后面再详解,这里暂时不做讲述。

 

7.指针做参数

这里只需记住,数组做参数传递时,传递的是数组的首地址。既然是地址,形参就要用一个指针来接收实参。

对于一维数组:

void possess(int *a)      <=>     void possess(int a[10])

{                  {

}                  }

子函数两种等价。

对于二维数组:

void possess (int a[][10])  <=> void possess (int (*a)[10])

两者等价。

 

而对于实参,只要记住传的是地址即可。

 

 

指针晦涩,用心区分记忆,勤于练习,方为王道。

 

~指针~