了解C语言之指针与数组

来源:互联网 发布:linux os update 编辑:程序博客网 时间:2024/04/30 03:36

一、数组的存储与访问

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为数组名,代表数组的首地址,它是一个常量,不能进行上述运算。

C语言-----指针与数组

利用指针,为数组从键盘输入值,并输出。

C语言-----指针与数组

习题

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语言-----指针与数组

三、二维数组的存储与访问 

二维数组的访问:

在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]

C语言-----指针与数组

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列元素的值

原创粉丝点击