指针变量既可指向变量,又可指向数组元素(把数组某一元素的地址存放在指针变量),它们都有地址。数组元素的指针就是数组元素的地址。
可以由两种办法引用数组元素。
1.下标法,如a【1】;
2.指针法,如p=&a【0】(p为指针变量)等价于p=a。
在用指针变量引用数组有几个很重要的知识点。
1.假设a为数组名,当指针引用时相当于a【0】,将a首元素地址赋值给p(p=a);
2.p=&a【0】,int p=a(将a首元素地址赋值给p),int p=&a【0】完全等价。
3.在scanf函数中&可以不写如scanf(“%d”,p)或scanf(“%d”,a)前提是p和a都为指针变量。a可为数组名。但这样做相当与把输入的值直接存放到a或p中
4.对于按一定顺序输出数组元素所用for循环不再用
而可以将定义一个指针变量p使p++代替a【i】,这样的执行效率也高。由这个例子引出知识点5.
(1)p++==a【i】(i++);
(2)p--同上类型;
(3)p++==(p+1)(由于++与同优先级,结合方向自左向右,先引出p的值,实现p,再使p
自增)。引出下面一个知识点。
(4)当出现数组a【0】++这样的相当与a【0】的值加一等价于(p)++。
5.当指针变量已指向一个数组元素时,p+1,p-1代表指针的移动,分别指向上一个元素和下一个元素。
两个指针相减,如p1-p2(都指向同一个数组),代表所指元素的距离,具体计算(地址相减再除去指针变量类型的字节长),但p1+p2毫无实际意义。
如果p的初值为a【0】,那么p+i和a+i都代表a【i】的地址。(p+i)和*(a+i)代表a【i】所指向的元素。
一个小tip:a【i】为数组名但实际上其实是地址,由直接访问(变量名加类型名、大小搜索),也就相当于地址。
6.可以有p【i】形式,但关键是看p所代表的是a数组中哪一号元素,若为【0】则p【i】相当于a【i】,若为【n】则为a【n+i】。
7.不能有a++的形式,因为a是一个常量代表数组首个元素的地址相当于a【0】;
8.函数可通过形参的改变改变实参也就是数组值。
知识点先这么多,有的话接下来补充。
例题辅助消化一下:
`#include<stdio.h>
int main()
{
int p,i,a[10];
p=a;
for(i=0;i<10;i++)
scanf("%d",p++);
for(i=0;i<10;i++,p++)
printf("%d\n",p);
return 0;
}`
输出结果
实际上这是因为在scanf中p++并非只是临时值,而是切实改变了,同理作为条件表达式时也是如此。容易栽坑。
只需要把p=a放scanf后即可。