关于如何区分数组指针和指针数组

关于指针数组和数组指针

要弄明白这两者的区别首先要知道()>[]>*  的优先级顺序。

1:数组指针本质上是一个指针,而且是一个指向数组的指针(又称为行指针),在这声明一下数组指针是指向二维数组的,对于一维数组数组没有任何意义。

而所谓的指针数组本质是一个数组,它的目的把相同类型的指针统一放在一个数组里,而且与数组指针不同的是:指针数组既可以用在一维数组中也可以用在二维数组中。

2:数组指针的声明方式为    int  (*p)[3]

   指针数组的声明方式为    int  *p[3]

从声明方式就可以简单的区分数组指针和指针数组。

3:下面看看数组指针和指针数组的用法:

例如写一个c程序(数组指针)

#include <stdio.h>

int main(){

         int a[2][3]={1,2,3,4,5,6};  //定义一个二维数组并且将数组初始化

         int  (*p)[3];                             //定义一个数组指针p

         int i;      

p=a;                                                //用指针指向这个二维数组(要注意这里的p指向的是每一行的地址所以p+1代表的是移动一行的地址,既把每一行看做是一个一维数组的话,就是移动一个一维数组的跨度)

printf("%d\n",**p);

printf("%d\n",**(p+1));

printf("%d\n",p[0][1]);

printf("%d\n",*(*p+2));

printf("%d\n",p[0][2]);

printf("%d\n",*(*(p+1)+2));

return 0;

}

运行结果如下:

1

4

2

3

3

6

由此可以看出在一个二维数组指针*(p+i)+j表示的是第i行第j列的地址*(*(p+i)+j)表示的是第i行第j列的元素。

关于指针数组的c程序

#include <stdio.h>

 

int main(){

         int a[2][3]={1,2,3,4,5,6};

int *p[3];  //指针数组

         int i;

         for(i=0;i<2;i++){

                   p[i]=a[i];

         }

printf("%d\n",p[0][1]);

printf("%d\n",**p);

printf("%d\n",*(*(p+1)+1)  );

printf("%d\n",*(p[1])  );

return 0;

}

运行结果如下:

2

1

5

4

通过比对这两个函数的程序还有运行结果,我们发现其实在二维数组中每一个数组指针,实际上就是一个指针数组里的一个元素,既在二维数组中数组指正和指针数组一样,但是要注意的是指针数组不可以统一赋值。

如果下图看做是一个二维数组

A        

B        

C        

\0              

a

b

c

\0




若分别用指针数组和数组指针去声明则可以如下

数组指针  Char (*p)[4] 用p指向第一行p++就指向下一行;

指针数组 char *p[4]  则p[0]就指向第一行,p[1]就指向第二行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值