指针变量与指向数组元素的指针思考

 以下使用指针引用数组元素并打印输出数字:
#include <stdio.h>
void main()
{
	int a[7]={1,2,3,4,5,6,7};
	int *aPtr,i;
	aPtr=&a[0];
	printf("********通过数组下标应用元素*************\n");
	for(i=0;i<7;i++)
	{
		printf("a[%d]=%d\n",i,a[i]);
	}
	printf("********通过数组名引用元素******************\n");
	for(i=0;i<7;i++)
	{
		printf("*(a+%d)=%d\n",i,*(a+i));
	}
	printf("********通过指针变量下标引用元素******************\n");
	for(i=0;i<7;i++)
	{
		printf("*aPtr[%d]=%d\n",i,aPtr[i]);
	}
         printf("********通过指针变量偏移引用元素******************\n");
	for(i=0,aPtr=a;aPtr<a+7;aPtr++,i++)
	{
		printf("*(aPtr+%d)=%d\n",i,*aPtr);
	}
}

上面的程序有四个for循环,下面我们分别来分析一下:

一、储备知识

      1、指针和变量结合就有了指针变量和变量指针,同理,指针和数组相结合就会有指针数组和数组指针。

      区别:(1)指针数组是一组指针变量;(2)数组指针是指向数组的指针;数组的指针指的是数组首地址,数组元素的指针指向该数组元素的地址。

      2、指向数组元素的指针→

还记得数组有个特别之处吗?:

例如,我定义了一个数组:int  a[3]={0,1,2};其中a就是一个数组,a[3]就是包含了3个int类型的数据,变量名a就是数组a的首地址,利用取地址符&,我们也可以得到首地址:&a[0];我们再来引入一个指针int *aPtr;这样如果设aPtr=&a[0],或者aPtr=a,则aPtr也将指向数组a的首地址。

另外,我们通过指针引用数组元素:*(aPtr+1)。如果aPtr是指向a[0],即数组a的首地址,那么aPtr+1就是数组a[1]的地址,如此类推。

值得我们注意的是,也是我们容易犯错误的:

     指针数组的指针是可以进行自增或自减运算,但是数组名不能进行自增或自减运算。因为数组名本质就是一个常量地址,是不可以改变的。

      3、既然谈到指针,不厌其烦再论述下指针的相关知识吧。

指针是C语言中的精华和灵魂。既然地位如此之高,的确,很难理解。很多人说都很难。我也是个菜鸟,就自己的理解说说自己想法。

        (01)指针其实也是一种变量,和其他变量一样,不要告诉我你不知道变量,不懂的,自己查书去敲打。因此我们准确来讲是指针变量,是变量它也会有值,比如说int类型的变量的值就是实实在在具体的整数值。指针的值就是内存地址。你是不是觉得那也太简单了吧?对不起,你想多了,指针包含的是变量的地址,而变量有拥有自己的具体值。哭晕了吧!变量名【直接】引用一个值,指针是【间接】地引用了一个值。                                                                                   

            换个说法,定义一个变量a(int a=8),变量a的存放地址是4000,4001,4003,4004共四个单元,另外定义一个指针bPtr(int *bPtr),  这个指针就是存放a的地址4000。而bPtr本身也有一个地址。假设指针变量bPtr地址为8000,其中存放的变量内容是4000,而4000是a变量的地址。

用一个变量来存放另一个变量的地址,我们称之为指针变量

下面让我们看看如何定义指针变量的:

int a=8;                    或者我们可以这样先声明后赋值:int a=5,*aPtr;

int *aPtr=&a;                                                                       aPtr=&a;

上面两种方法都是可以的。

      (02) 不知道你理解了没有?还有点玄乎吧尴尬。我再来举个生活中的例子——抽屉理论安静

*******情景回放:大笑

         1)道具:一张桌子、两个抽屉A与B(每个抽屉个一把锁)、一本C++指导书。

         2)Action:将书本放到抽屉A中保存下来,为了安全起见,将A锁上,拔出钥匙;

                                  为了不让别人也把抽屉B偷看,也锁上,并且拔出钥匙。

         3)为了安全,不会讲两个钥匙都放在桌面不管了吧?你的带走。要不然,抽屉锁没锁还不是一样吗?方法:

                    a、我口袋大,同时将两把钥匙都装在身上,需要抽屉的东西时候,我再打开;可以,完全可以嘛;

                    b、我人懒,还有粗心大意的毛病,我就只想带一个就可以了。那么就可以这样干:将A的钥匙放在B的抽屉中,反正B抽屉有没有我想要的东西。再将抽屉B锁上,带走钥匙B。当需要C++宝典的时候,我先打开抽屉B,取出A钥匙再打开抽屉A,取出书本。

 *******观后感:偷笑

         1)桌子就是一个程序,抽屉就是内存,A和B分别代表内存单元。书本就是说要存储和访问的变量内容。

         2)方法a就相当于通过变量直接引用变量内容;方法b就相当于通过指针间接引用。

         3)抽屉B的钥匙==指针变量;抽屉A的钥匙==一般的变量。

      (03)指针变量的引用

       指针变量的操作主要是通过取地址运算符&和指针运算符*来实现。前面我们举过例子(int *aPtr=&a; ),其中&a指的是变量a的地址;而*aPtr表示变量aPtr所指向的内存单元存放的内容。

       (04)此外,&和*作为单目运算符,结合性是从右到左的,优先级别相同

                例如:&*p将会先进行*运算,在进行&运算;同理,*&p则是先&后*。

       (05)得意注意的是:指针变量只能用来存放地址或指针,不能见一个整形赋值给指针变量。

                                        指针变量类型与所指向的变量类型一样。

二、现在我们来分析一下前面开篇引言的那段四个for语段的程序:

        (1)第一个for语句,利用数组的下标访问数组元素。(printf("a[%d]=%d\n",i,a[i]);)

        (2)第二个for语句,使用数组名访问数组元素(注意,地址可以先一般变量那样加减运算,但是指针的加减1表示一个元素单元)(printf("*(a+%d)=%d\n",i,*(a+i));)

        (3)第三个for语句,采用指针访问数组中的元素。(printf("*aPtr[%d]=%d\n",i,aPtr[i]);)

        (4)第四个for语句,先将指针偏移,然后对该指针所指向的内容进行访问。(printf("*(aPtr+%d)=%d\n",i,*aPtr);)

         可谓条条大路通罗马

 

****************************************************************************************************************************************************************************************

❤永葆一颗纯洁、宽容平和、仁慈谦卑和意气风发的心!

态度决定一切     努力改变命运

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值