在数组指针和指针数组这块我总是弄不清楚,总结一下
指针数组:用于存储指针的数组,也就是数组元素都是指针
数组指针:指向数组的指针
关于这部分有一道题:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型
类型名称 *数组名称[数组长度];
int* a[4] 指针数组
表示:数组a中的元素都为int型指针
元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*
int (*a)[4] 数组指针
表示:指向数组a的指针
元素表示:(*a)[i]
#include <stdio.h>
void main(void)
{
int c[4]={1,2,3,4};
int *a[4]; //指针数组
int (*b)[4]; //数组指针
b=&c;
//将数组c中元素赋给数组a
for(int i=0;i<4;i++)
{
a[i]=&c[i];
}
printf("%d\n",*a[1]); //输出2就对 <pre name="code" class="plain"> printf("%d\n",<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(*b)[2] </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">); </span>
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">} </span>
注意:
定义了数组指针,必须给指针指定一个数组的首地址
容易犯的错得就是,不给 b 地址,直接用 (*b)[i]=c[i] 给数组 b 中元素赋值,这时数组指针不知道指向哪里,调试时可能没错,运行时会出现问题,使用指针时要注意这个问题。a就不用给他地址,a的元素是指针,for循环内已经给数组a中元素指定地址了。若for循环内写*a[i]=c[i],也会出问题。
了解数组指针,与普通指针及二级指针的区别
{int a[4][5];int (*p)[5]=a;}
这里a是个二维数组的数组名,相当于一个二级指针常量;
p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位;
*p+i是二维数组a[0][i]的地址;
*(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示a[2][3]的值。
(*p)[5]其中的5在上述例子中没有表示任何意思你可以换成除0以外的整数,[5]的作用就是帮助你记忆说你所指向的一维数组的长度。
(不过除了与定义的二维数组的长度一致的不会警告之外 )其他的数会警告但是不影响结果。
//(*p)[5]其中的5换成其他的数字在vc++6.0环境中都无法通过编译
数组指针:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=a;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
}
printf("\n");
}
指针数组:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(int ix=0;ix<3;ix++)
{
p[ix]=a[ix];
}
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
}
printf("\n");
}