指向数组元素的指针:
所谓数组元素的指针就是数组元素的地址。
所谓数组元素的指针就是数组元素的地址。
首先定义一个数组:
int a[10];
再定义一个指针:
int *p;
将数组的首地址赋给指针p有两种方法:
p = a;//数组名代表数组中第一个元素(即序号为0的元素)的地址
p = &a[0];//使用取地址运算符获得数组第一个元素的地址
这两种方法是等价的。
也可以在定义指针变量时初始化:
int *p = a;//这里的*表示定义的是指针变量,不是间接访问运算符(又称指针运算符):取内容
int *p = &a[0];
先定义后赋值,和定义的时候就初始化,他们是有区别的。
int *p = a;这句语句,相当于int *p; p = a;两句。这两种方法不能搞混了。
给数组元素赋值的方法:
a[i] = 1; *(p+i) = 1;
引用数组元素的说明:
(1)p+i和a+i就是a[i]的地址,它们指向a数组的第i个元素。
p+i和a+i的计算方法为:p+i*d,a+i*d.d为一个数组元素所占的字节数。
(2)*(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i].
[]是变址运算符。
使用指针引用和给数组赋值已经没有问题了。可以用指针变量作函数参数接收数组地址,这里略过。
下面总结一下指针和二维数组。
首先定义一个二维数组:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
a是一个数组名。a数组包含3行,即3个元素:a[0],a[1],a[2]。而每个元素又是一个一维数组,它包含四个元素。所以可以认为二维数组是“数组的数组”,即二维数组a是由3个一维数组所组成的。
从二维数组的角度来看,a代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由4个整型元素所组成的一维数组。所以a代表的是首行的起始地址(即第0行的起始地址,&a[0]),a+1代表a[1]行的首地址。
a[0],a[1],a[2]都是一维数组名。数组名代表数组首元素的地址,所以a[0]代表&a[0][0],a[1]代表&a[1][0],a[2]代表&a[2][0]。a[0]+0,a[0]+1,a[0]+2,a[0]+3分别是a[0][0],a[0][1],a[0][2],a[0][3]元素的地址。
如果要得到a[0][1]的值,用地址法怎么表示呢?a[0][1]元素的值就是*(a[0]+1),而a[0]又是和*(a+0)无条件等价的,因此可以用*(*(a+0)+1)表示a[0][1]的值。依此类推,*(a[i]+j)或*(*(a+i)+j)是a[i][j]的值。
指向多维数组元素的指针变量:
1:指向数组元素的指针变量
int *p;使p指向二维数组的第一个元素的首地址,通过增加地址值来遍历整个二维数组。因为二维数组在内存中是顺序存放的。
2:指向由m个元素组成的一维数组的指针变量
如果指针变量p指向a[0](即p = &a[0]),则p + 1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。
定义指向包含m个元素的一维数组的指针变量:int (* p)[m];赋值:p = a;引用:*(*(p+i)+j);
1:指向数组元素的指针变量
int *p;使p指向二维数组的第一个元素的首地址,通过增加地址值来遍历整个二维数组。因为二维数组在内存中是顺序存放的。
2:指向由m个元素组成的一维数组的指针变量
如果指针变量p指向a[0](即p = &a[0]),则p + 1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位。
定义指向包含m个元素的一维数组的指针变量:int (* p)[m];赋值:p = a;引用:*(*(p+i)+j);
程序示例:
#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int b[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i = 0, j = 0;
int *p;
p = a;//or p = &a[0];
printf("a[i]/t*(a+i)/t*(p+i)/n");
for (i =0; i< 5; i++)
{
printf("%d/t%d/t%d/n",a[i],*(a+i),*(p+i));
}
p = a;//or p = &a[0];
printf("a[i]/t*(a+i)/t*(p+i)/n");
for (i =0; i< 5; i++)
{
printf("%d/t%d/t%d/n",a[i],*(a+i),*(p+i));
}
printf("/nAddress of:/nb/t/tb[0]/t/tb[1]/t/tb[2]/n");
printf("%p/t%p/t%p/t%p/n",b,b[0],b[1],b[2]);
printf("%p/t%p/t%p/t%p/n",b,b[0],b[1],b[2]);
printf("/nTravel of Two_Dimension_Array B:/n");
for(i = 0; i < 3; i++)
{
printf("Array of b[%d]: ",i);
for(j = 0; j < 4; j++)
{
printf("%d/t",*(b[i]+j));//等j价于*(*(b+i)+j)
}
printf("/n");
}
for(i = 0; i < 3; i++)
{
printf("Array of b[%d]: ",i);
for(j = 0; j < 4; j++)
{
printf("%d/t",*(b[i]+j));//等j价于*(*(b+i)+j)
}
printf("/n");
}
printf("/nTravel of Two_Dimension_Array B:/n");
int *ptr = b[0];//or int *ptr = &b[0][0];
for(i = 0, j =0; i < 12; i++)
{
printf("%d/t",*ptr++);
j++;
if(j%4 == 0)
printf("/n");
}
int *ptr = b[0];//or int *ptr = &b[0][0];
for(i = 0, j =0; i < 12; i++)
{
printf("%d/t",*ptr++);
j++;
if(j%4 == 0)
printf("/n");
}
printf("/nTravel of Two_Dimension_Array B:/n");
int (*ptr_array)[4] = b;//指向m个元素组成的一维数组的指针变量
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d/t", *(*(ptr_array+i)+j));
}
printf("/n");
}
int (*ptr_array)[4] = b;//指向m个元素组成的一维数组的指针变量
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d/t", *(*(ptr_array+i)+j));
}
printf("/n");
}
printf("/nSomething else:/n");
printf("/nTravel of Two_Dimension_Array B:/n");
int (*(*pptr))[4] = &ptr_array;//指向m个元素组成的一维数组的指针变量的指针变量
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d/t", *(*(*pptr+i)+j));
}
printf("/n");
}
int (*(*pptr))[4] = &ptr_array;//指向m个元素组成的一维数组的指针变量的指针变量
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%d/t", *(*(*pptr+i)+j));
}
printf("/n");
}
char *string[3][4] = {"visual basic","c#","c++","inheritance",
"visual.net","base class","perl","python",
"visual c++","pasical","fortuan","c",};
char *(*chptr)[4] = string;//指向m个字符串元素组成的一维数组的指针变量
printf("/nTravel of Two_Dimension_Array string(Character Array):/n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%s/t/t", *(*(chptr+i)+j));
}
printf("/n");
}
printf("/n");
"visual.net","base class","perl","python",
"visual c++","pasical","fortuan","c",};
char *(*chptr)[4] = string;//指向m个字符串元素组成的一维数组的指针变量
printf("/nTravel of Two_Dimension_Array string(Character Array):/n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 4; j++)
{
printf("%s/t/t", *(*(chptr+i)+j));
}
printf("/n");
}
printf("/n");
return 0;
}
}