指针数组:用指针的方式引用数组
需要注意:数组名是数组首元素的地址,即a=&a[0];所以
int *p;
p=&a[0]与p=a等价;
指针的运算
因为指针就是地址所以指针的乘除是没有意义的;指针的加减就是地址的加减;并且,指针p+1并不是地址+1;而是指向数组中下一个元素的地址;例如:在整形数组中每个元素占4个字节,p+1就等于地址+4。
在同一数组中,两个元素的地址之间可以相减,相减可以得到两个元素之间的相对距离;
但是不能相加,相加是没有意义的。
通过指针引用数组
通过指针引用数组有两种方式
1)下标法
2)指针法
用实例来说明:
#include <stdio.h>
void xia();
void ming();
void zhi();
void zhi2();
int main(){
//xia();
//ming();
//zhi();
zhi2();
}
//下标法引用数组
void xia(){
int a[10];
int i;
printf("输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
printf("这是下标法的结果:");
for(i=0;i<10;i++){
printf("%d ",a[i]);
}
}
//数组名引用数组
void ming(){
int a[10];
int i;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",&a[i]);
}
printf("这是数组名的结果:");
for(i=0;i<10;i++){
printf("%d ",*(a+i));
}
}
//指针引用数组
void zhi(){
int i,a[10],*p;
p=a;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",(a+i));
}
printf("这是指针法的结果:");
for(i=0;i<10;i++){
printf("%d ",*(p+i));
}
}
//指针法改
void zhi2(){
int i,a[10],*p;
printf("请输入10个整数:");
for(i=0;i<10;i++){
scanf("%d",(a+i));
}
printf("这是指针法2改的结果:");
for(p=a;p<(a+10);p++){
printf("%d ",*p);
}
}
这四个函数运行结果是一样的
运行结果如下:
在二个用数组名引用数组中,输出语句的*(a+i)与*(p+i)等价;因为a是数组名,不带下标的话代表的是a[0]的地址。
指针下标:
当指针指向数组时, 指针也可以带下标指针,如p[i];
因为程序编译过程中下标都会转化为地址,如*p[i]会被处理成*(p+i),只有当p指向a[0]时,p[i]才是a[i]。