
目录
三、指针与数组(简单篇)
指针与++:
指针与+:
指针求差:
指针表示法和数组表示法:
三、指针与数组(简单篇)
首先,我们举一个变相使用指针的栗子--数组名,也就是数组首元素的地址。
rabbit=&rabbit[0]; 不过这两个都是地址,是不会改变的常量,但是如果把他们赋值给指针变量,我们就可以修改指针变量的值实现访问数组各元素。
指针与++:1.(*rabbit)++;
*rabbit不就是拿着小钥匙开门吗?所以括号里面是一个数啦~这句话相当于数的++;
2.*(rabbit++);
rabbit是数组首元素的地址吖,一次rabbit++就相当于地址+1,不过这里的加1不是真正意义上的加一(不好意思有点绕),因为地址是按照字节编址的,所以实际上是加一个储存单元,也就是“一个数据类型的长度”。这也侧面反映了为什么我们在声明一个指针变量时必须声明所指对象。
所以这一次的rabbit++指向下一个元素,也就是rabbit[1];
练习2.1:
来感受一下指针访问数组的快乐叭~
#includeint main() { int rabbit[5]={0,1,2,3,999}; int *p; p=&rabbit[0];//p指向rabbit数组的首元素 int i=0; for(i=0;i<5;i++) { printf("%dn", (*p)++ );//这样输出的不是数组元素们 } for(i=0;i<5;i++) { printf("%dn", *p++ );//这样才是访问数组元素呢 } return 0; }
指针与+:
首先声明*的运算级是高于+的,所以*rabbit+2就相当于给rabbit加了小括号,即(*rabbit)+2;
rabbit+2==&rabbit[2]; //地址相同
*(rabbit+2)==rabbit[2]; //相同的值,可以理解为 “到rabbit的房间门口,移动2个类型单元房间并检索房间里的人”
我们敲一段代码感受一下
练习2.2:
#includeint main() { int rabbit[5]={0,1,2,3,4}; int *p; p=rabbit;//p指向rabbit数组的首元素 printf("%dn",rabbit[0]); printf("%dn",*rabbit); printf("%dn",*p); printf("%dn",*p+999);//看叭,是给数值加999对吧~ printf("%dn",rabbit[3]); printf("%dn",*(p+3));//这个就是地址在移动了 return 0; }
既然我们可以通过指针访问数组里的各个元素,闲着也是闲着,不如写一个函数,求数组各元素的和,用指针写好啦~
练习2.3:
#includeint Sum(int *ar,int num)//形参num是数组中元素的个数 { int sum=0; for(int i=0;i 值得一提的是,int *ar和int ar[]都可以表示ar是一个指向int的指针;后者更能表示出指向的是一个int类型的数组。
指针求差:int *p1=&rabbit[0]; int *p2=&rabbit[1];
p2-p1=???
我们敲一段代码试试:
#includeint main() { int rabbit[5]={0,1,2,3,999}; int *p1=&rabbit[0]; int *p2=&rabbit[1]; printf("%dn",p1); printf("%dn",p2); printf("%d",p2-p1); return 0; } 我的电脑得到的结果是:p1=6487536 p2=6487540 p2-p1=1
一般来说,我们的指针求差指向的是同一个数组的不同元素,得出结果是两个元素间的距离,其单位和数组类型单位一样。上例里面1指的就是两个元素相隔1个int。
指针表示法和数组表示法:因为之前都用int类型的数组,这次换个口味~~
- char *p="some"; char rabbit[ ]="rabbit"; rabbit[i] 与 *(rabbit+i) 与 *(p+i)是等价的
- p是指针变量;rabbit是地址常量。
- 初始化:对于p就是把地址拷贝一份;对于rabbit就是把静态存储区中的字符串拷贝到数组里。
- 可以递增指针来访问下一个数组元素:++p;但是没有++rabbit
(哒咩)- 不过两者都可以加法,可以rabbit+1来标识下一个元素
当然,p也可以用数组表示法,即p[i];
好啦好啦,窝该睡觉啦~晚安uu们~~
2021.11.24
SThree楠钰子.
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)