目录
一、数组的指针
在c语言中,数组的指针就是数组的首元素在内存中的地址,也就是数组在内存中的起始地址,如下代码:
#include<stdio.h>
main()
{
int arr[1];
scanf("%d",arr);
printf("arr[0]=%d",arr[0]);
}
运行结果:
2
arr[0]=2
在scanf语句中,在arr之前并没有添加&取地址符,但仍然接收了2,由此可得,数组名也是一个地址,它即为数组的起始地址。
如果将数组的起始地址赋给某个指针变量,那么这个指针变量就是指向数组的指针变量,其定义方式为:
int a[10],*p=a(或*p=a[0]);
在运用的时候可以将指针当做数组名。
当需要用指针操作整个数组的时候,可以用p+i和a+i来表示数组元素a[i]的地址,因此*(p+i)和 *(a+i)就是数组元素a[i],同时可以将指针变量p看做数组名,两者可以互相转化,p[i]等价于*(p+i)等价于a[i]。例如:
#include<stdio.h>
main()
{
int a[5],*p,i;
p=a; //将数组a[5]的起始地址赋给指针变量p
for(i=0;i<5;i++)
scanf("%d",p+i);//等价于scanf("%d",a[i])
for(i=0;i<5;i++)
printf("%d ",p[i]);//等价于printf("%d ",a[i])
}
输出结果为:
1 2 3 4 5
1 2 3 4 5
也可以使用以下方式来表达:
#include<stdio.h>
main()
{
int a[5],*p,i;
p=a;
for(i=0;i<5;i++)
scanf("%d",p+i);
for(;p<a+5;p++)
printf("%d ",*p);
}
输出结果为:
1 2 3 4 5
1 2 3 4 5
二、指针数组
1.指针数组的定义
当整个数组中的每一个元素都是一个指针变量的时候,这个数组就被称为指针数组,其定义格式为:
数据类型符 *变量名[常量表达式];
2.指针数组的引用
#include<stdio.h>
main()
{
int a[5]={6,7,8,9,0},i;
int *p[5];
for(i=0;i<5;i++)
{
p[i]=&a[i];
printf("%d ",*p[i]);
}
}
输出结果为:
6 7 8 9 0
如上,定义一个指针数组*p[5],并且将这个指针数组的每个单元指向了数组a[5] 的各个单元,这个指针数组中存放着对应数组a[5]中每一个元素的首地址。
三、数组指针
1.数组指针的定义
数组指针值的是一个指针指向一个一维数组,存放了这整个数组的地址,其定义方式为:
数据类型符 (*数组名)[常量表达式];
2.数组指针的引用
在二维指针中,其数据单元在内存单元中是按行排列的即先存放第一行的数据元素,以此类推,定义一个二维数组a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},我们可以将其看成如下排列方式:
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
该二维数组可以看成是由三个元素a[0],a[1],a[2]组成的一维数组,a是该一维数组的数组名,即该一维数组的首地址,即第一个元素a[0]的地址,我们已知,a+1表示的就是首地址之后的第一个元素的首地址即a[1]的地址,因此,通过这些地址就可以引用各个元素的值,如*(a+1)就是元素a[1],*(a+2)就是元素a[2]。
在此基础上,可以将a[0],a[1],a[2]这三个元素看成由四个元素组成的一维数组的数组名,如,a[0]可以看成由a[0][0],a[0][1],a[0][2],a[0][3]组成的一维数组,与上面类似,a[0]是该一维数组的数组名,即该一维数组的首地址,即第一个元素a[0][0]的地址,则,a[0]+1表示的就是首地址之后的第一个元素的首地址即a[0][1]的地址,因此*(a[0]+1)就是元素a[0][1],*(a[2]+3)就是元素a[2][3].
如下引用:
#include<stdio.h>
main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},i,j;
int *p;
p=&a[0][0];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%d\t",*(a[i]+j));
}
printf("\n");
}
}
输出结果为:
1 2 3 4
5 6 7 8
9 10 11 12