了解C语言之指针与数组
一、数组的存储与访问
小结:
a[i]的地址是: &a[i] <=> a+i
a[i]的内容是: a[i] <=> *(a+i)
二、指向一维数组的指针
需要定义一个基类型与数组元素数据类型相同的指针变量。
#include<stdio.h>
#define N 10
void main( )
{ int a[N],i;int *p=a; 下标法
for(i=0;i<N;i++)
scanf("%d",a+i); 地址法
for(i=0;i<N;i++)
printf("%d",p[i]); 指针变量下标运算法
}
方法二:指针变量法
#include<stdio.h>
#define N 10
void main( )
{
int a[N],*p;
for(p=a;p<a+N;p++)
scanf("%d",p);
for(p=a;p<a+N;p++)
printf("%d",*p);
}
思考:每次p++执行的是什么操作?
p将指向数组中下一个元素。
是否可以进行a++或a--这样的运算?
a为数组名,代表数组的首地址,它是一个常量,不能进行上述运算。
利用指针,为数组从键盘输入值,并输出。
习题
1、若有以下说明和语句,且i>=0&&i<10,则下面(B)是对数组元素的错误引用
int a[]={1,2,3,4,5,6,7,8,9,0},*p, i;
p=a;
A、*(a+i) B、p+i C、a[p-a] D、*(&a[i])
2、设变量定义为“int a[4]={1,3,7,9},*p=a+2;
则*p的值为__7___。
三、二维数组的存储与访问
二维数组的访问:
在C语言中,将二维数组看成是由若干个一维数组构成的一维数组。如:int a[3][4],定义了一个二维数组,逻辑上把它看成3行4列的矩阵:
0列 1列 2列 3列
0行 a[0][0] a[0][1] a[0][2] a[0][3]
1行 a[1][0] a[1][1] a[1][2] a[1][3]
2行 a[2][0] a[2][1] a[2][2] a[2][3]
int a[3][4];
行指针(地址值):a+i <=> &a[i]
列指针(地址值):*(a+i) +j <=> a[i]+j
元素a[i][j] 的值:a[i][j] <=> *(a[i]+j) <=> *(*(a+i) +j)
int a[3][4],*p=a[0];设数组a的首地址值为3000,则:
a+1的结果为:3008
a[0]+1的结果为:3002
&a[0][0]+1 的结果为:3002
p+1的结果为:3002
例:
输入输出二维数组中的所有元素。 地址法
#define M 4
#define N 5
void main( )
{ int a[M][N],i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",a[i]+j);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
printf("%d",*(a[i]+j));
printf("");
}
方法二: 指针变量法
#define M 4
#define N 5
void main( )
{ int a[M][N],i,*p;
for(p=&a[0][0];p<&a[M-1][N-1];p++)
scanf("%d",p);
for(p=&a[0][0];p<&a[M-1][N-1];p++)
printf("%d",*p);
}
1、下列_D_形式不表示二维数组a的第1行第2列的元素地址
A、a[1]+2 B、*(a+1)+2
C、&a[1][2] D、*(a[1]+2)
2、数组定义为int a[4][5],引用*(a+1)+2表示 B
A、a[1][0]+2 B、a数组第1行第2列元素地址
C、a[0][1]+2 D、a数组第1行第2列元素的值