版权声明:本文由 Micheal 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/83931063
指针引用数组元素
- 方法一、下标法 : 如a[i]形式
- 方法二、指针法 : 如*(a+i)、*(p+i)形式。其中a是数组名,p是指向数组元素的指针变量
** 问题:有一个整形数组a,有10个元素,要求输出数组中的全部元素**
- 下标法
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
for(int i=0;i<5;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
- 通过数组名计算数组元素的地址,找出元素的值
#include<stdio.h>
int main(){
//若需手动输入可以在循环中使用:scanf("%d",a+i);来代替scanf("%d",&a[i]);
int a[5]={5,0,3,1,2};
for(int i=0;i<5;i++){
printf("%d ",*(a+i));
}
printf("\n");
return 0;
}
或者:
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
int *p=a; //另外用指针指向数组,但不能写成: int *p=&a;(错误原因:cannot convert from 'int (*)[5]' to 'int *')
for(int i=0;i<5;i++){
printf("%d ",*(p+i));
}
printf("\n");
return 0;
}
补充说明:
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
int (*p)[5]=&a; // 可以用指向一维数组的指针实现
//(*p)[5]:
//类型表示:int (*)[4];
//含义:p为一个指针变量,指向含有5个元素的一维数组;
//多用于多维数组的处理中;
for(int i=0;i<5;i++){
printf("%d ",*(*(p)+i));
}
printf("\n");
return 0;
}
- 用指针变量指向数组元素
#include<stdio.h>
int main(){
int a[5]={5,0,3,1,2};
int *p;
for(p=a;p<(a+5);p++){
printf("%d ",*p);
}
printf("\n");
return 0;
}
用指针变量输入数据并输出数据
#include<stdio.h>
int main(){
int a[5];
int *p=a;
for(int i=0;i<5;i++){//输入操作
scanf("%d",p+i);
//等价scanf("%d",p++);
//等价于scanf("%d",&a[i]);
//等价于scanf("%d",a+i); //a代表数组首元素地址,它是一个指针型常量,程序运行期间值不变(不同于p),故不能用a++;
}
//输出方式一:用 a[i] 或用 *(a+i) ; 但不能使用a++(原因:a是指针型常量)
for(i=0;i<5;i++){
printf("%d ",a[i]);//等价于 printf("%d ",*(a+i));
}
printf("\n");
p=a;//必须把指针重新指向a的首元素
//输出方式二:用 *(p+i) 或者 *p++ ; 注意:要把指针重新指向a的首元素
for(i=0;i<5;i++){
printf("%d ",*(p+i));//等价于 printf("%d ",*p++);
}
printf("\n");
//输出方式三:用*p
for(p=a;p<(a+5);p++){
printf("%d ",*p);
}
putchar(10);//等价于printf("\n");
return 0;
}
注意
- *p++ : 等同于 *(p++);因为++和 *同优先级;先引用p的值,实现 *p的运算,然后p自增1;
- *(p++) 不等同于 *(++p) ;(假设p的初值为a,即&a[0])
前者 *(p++) :① *p ②p++ ; 若输出 *(p++),得到a[0]的值;
后者 *(++p):①p++ ② *p; 若输出 *(++p),得到a[1]的值; - ++(*p):表示p所指向的元素值+1;假设p=a,则++(*p)相当于++a[0];
注意:是元素的值加1,而不是指针p的值加1;