很多时候我们看到数组指针和指针数组是不是不注意看就很容易把它们忽略掉呢,记得以前我还是傻傻分不清楚有什么区别;
很显然指针数组和数组指针是不同的。
指针数组:
例如:
char a[3][8]={"gain","much","strong"};
char *n[3]={"gain","much","strong"};
n[3]就是一个指针数组,很显然它本质上是一个数组,而数组中存放的元素是指针类型的,char表示存放的指针类型是字符型。
char * 是类型说明。其他也有 int *,float * 等等。
数组指针:
例如:
char
c[2][3] = {
"祖"
,
"国"
,
"好"
,
"好"
,
"祖"
,
"国"
};
//因为一个汉字占用两个字节
char
(*p)[3] = c ;
此时 p 就是数组指针,它存放的是字符数组c的地址;
具体的说它指向包含3个字符型(char)元素的一维数组;
*(p+i)是二维数组c[i][0]的地址;
*(p+2)+3表示c[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)表示c[2][3]的值
一般来说指针存放的是数组首元素的地址;
举例:
数组指针:
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 ix=0;
int i=0;
int j=0;
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p[3];
for(ix; ix < 3; ix++)
{
p[ix] = a[ix];
}
for(i; i < 3; i++)
{
for(j = 0; j < 4; j++)//注意这里的j要赋值等于0,要不然只能输出第一行1234,达不到预期的效果
{
printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
}
printf("\n");
}