以下使用指针引用数组元素并打印输出数字:
#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);)
可谓条条大路通罗马
****************************************************************************************************************************************************************************************
❤永葆一颗纯洁、宽容平和、仁慈谦卑和意气风发的心!
态度决定一切 努力改变命运