数组指针和指针数组的区别

来源:互联网 发布:南京java培训机构 编辑:程序博客网 时间:2024/05/16 15:36

中国的文字博大精深,不仔细研读,很容易理解错误,就拿这个数组指针和指针数组来说吧,刚开始接触很容易弄混
那么到底什么是数组指针?什么是指针数组?他们之间又有什么区别?
指针数组: 数组里的每一个元素都为指针的数组,本质为数组,只不过数组里的元素为指针罢了,至于是什么类型的指针,那要视情况而论
数组指针:指向数组的指针,本质为指针,只不过这个指针指向了数组而已
下来我们来看看在代码中我们如何定义以及使用指针数组和数组指针
我们下来看指针数组
看一个例子:int * a[3]; 这句话的意思是:定义一个指针数组,这个数组里有三个元素,这三个元素的类型是int * 类型所以说我们可以把 int 类型的 变量的地址赋给这个指针数组,我们来看一个实例:

#include <stdio.h>int main{    int a = 1,b = 2;//定义两个int 类型的变量    int *p[2];//定义一个指针数组,里面可以存放int 类型变量的地址    p[0] = &a;//把 a 的地址赋给p[0],p[0]指向 a    p[1] = &b;    printf("%d %d\n",*p[0],*p[1]);//p[0]里存的是a变量的地址,所  以*p[0]就是a    return 0;}

输出结构是
1 2
下来我们来看数组指针
首先我们看一下数组指针怎么定义:int (*p)[3]; 这样我们就定义了一个数组指针,我们来剖析一下这个的含义,首先()的优先级高,所以首先p 和*结合,说明 p是一个指针,然后int 和[3]都是修饰这个指针的,意思是,这个指针指向了一个里面有3个int型元素的数组
我们来看这么一个例子:

#include <stdio.h>int main(void){    int a[3] = {1,2,3};    int (*p)[3] = &a;    printf("%p  %p  %d  %d\n",p,*p,**p,*p[0]);    return 0;}

大家思考一下,输出结果是什么?
结果是:
0018FF3C
0018FF3C
1
1
为什么p和*p的值一样?为什么**p的值和*p[0]的值一样?下面我们来分析分析
前面我们已经说过,p是一个指向数组的指针,(这里的p只不过是指针变量的名字,说p指向一个数组,其实就是p变量保存了数组的首地址)
那么,在上面的例子中我们把 a 数组的地址给了这个指针变量(注意:&a取得是整个数组的地址)所以p指向了这个数组,p的值是数组首字节的地址
这里要注意的是*p的类型是int * 类型,为甚么呢?不是 *p应该是这个数组吗?这是因为在C语言中规定,数组“本身”出现在非 在非sizeof,非 & 后面时,会自动转换为指向数组首元素的指针,也就是说,这里的*p转化为数组首元素的指针了(这个指针的值为第一个首元素第一个字节的地址,映射的是四个字节)
在这个数组中的首元素的类型是int ,所以*p的类型就为int * 了,所以 *p的值就和p的值相等了,**p的值就为第一个元素的值 1 了,而*p[0]则因为[]的优先级高,所以 p[0]就是数组首元素的地址,*p[0]就为数组首元素了
结果也就不难理解了

2 0
原创粉丝点击