数组指针
一个变量有一个地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。
定义一个指向数组元素的指针变量
int a[10]; //定义a为包含10个整型数据的数组
int *p; //定义p为指向整型变量的指针
p=&a[0] //应当注意,因为数组为int型,所以指针变量也应为指向int型的指针变量。
把a[0]元素的地址赋给指针变量p。也就是说,p指向a数组的第0个元素。
C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。
int a[10];
int *p;
// 第一种方式
p=&a[0];
p=a;
// 第二种方式
int *p=&a[0];
//这两种方式是等价的
指针引用数组如果指针变量p已指向数组中的一个元素,
p+1指向同一数组中的下一个元素。
p-1指向同一数组中的前一个元素。
p = &a[0] // 指针p 指向数组首地址
//p+i 就是 a[i] 的地址,或者说它们指向a数组的第 i 个元素。
[/i]p+5 // 现在p往后移动5个元素,现在指向 a[5]的地址
// *(p+i) 就是 p+i 所指向的数组 a元素(的内容)
*(p+5) // 就是a[5]的内容
输出数组
//使用下标方法
#include <stdio.h>
int main(){
int a[10], i;
// 赋值
for(i=0; i<10; i++)
a=i;
//打印
for(i=0;i<10;i++)
printf("a[%d]=%d\n", i, a);
return 0;
}
//使用计算元素的地址方法
#include <stdio.h>
int main(){
int a[10], i;
//赋值
for(i=0; i<10; i++)
*(a+i) = i;
//打印
for(i=0; i<10; i++)
printf("a[%d]=%d\n", i, *(a+i));
return 0;
}
//指针变量指向元素方法
#include <stdio.h>
int main(){
int a[10], i, *p;
p = a;
//赋值
for(i=0; i<10; i++)
*(p+i) = i;
//打印
for(i=0; i<10; i++)
printf("a[%d]=%d\n", i, *(p+i));
return 0;
}
例子
判别一个整数数组中各元素的值,若大于0 则输出该值,若小于等于0则输出0值。
#include <stdio.h>
void nzp(int *a){
int i;
for(i=0; i<5; i++){
if(a[i]<0) a[i]=0; //小于0的元素,赋值为0
}
}
int main(){
int b[5], i;
printf("Input 5 numbers:\n");
for(i=0; i<5; i++)
scanf("%d", &b[i]);
printf("Initial values of array b are: ");
for(i=0; i<5; i++)
printf("%d ", b[i]);
nzp(b);
printf("\nFinal values of array b are: ");
for(i=0; i<5; i++)
printf("%d ",b[i]);
return 0;
}
运行结果:
Input 5 numbers:
1↙
3↙
-90↙
-23↙
100↙
Initial values of array b are: 1 3 -90 -23 100
Final values of array b are: 1 3 0 0 100
说明:
- 形参数组 和 实参数组类型必须一致
- 形参数组和实参数组的长度可以不同, 一般定义方法原型的参数,可以允许不给出数组长度。如写成 void nzp(int a[]), 当然也可以 void nzp(int *a)