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

昨天聊了常量指针和指针常量的区别,今天继续一个比较容易混淆的话题,指针数组和数组指针

数组指针

含义:指向数组的的指针
(1)数组在内存中的表示
创建一个数组就是在内存里面开辟一块连续的空间,比如int a[4];就是在内存里面开辟了一个大小为4*sizeof(int)字节的内存空间。而二维数组是特殊的一维数组。

void main()  
{
    int a[2][2]={1,2,3,4};//这是一个2*2的二维数组  
    int (*p)[2];//数组指针  
    p=a;//令p指向数组a  
}

这里p是一个指向数组的指针。
让我们理解数组名和数组指针变量:a,a[0],a[1],p,a+1,a[0]+1,p+1这些分别代表什么意思呢?
a是一个数组名,类型是指向一维数组的指针,不是变量,a的值是指针常量,即不能有a++或者a=p这些操作。a指向这块连续空间的首地址,值是&a[0][0]。
答案:
a[0]是一维数组名,类型是指向整型的指针,值是&a[0][0],这个值是一个常量。
a[1]是一维数组名,类型是指向整型的指针,值是&a[1][0],这个值是一个常量。
p是一个数组指针变量,指向一维数组的指针变量,值是&a[0][0]。可以执行p++;p=a等操作。
a+1表示指向下一行元素,也可以理解为指向下一个一维数组。
*(a+1)是取出第一行的首地址。
a[0]+1是指向第0行第1个元素,也可以理解为指向一维数组a[0]的第一个元素。
p+1同a+1
(p+1)同(a+1)
虽然a跟a[0]值是一样,但类型不一样,表示的意义不一样。通过分析就不难理解为什么((a+i)+j)和a[i][j]等效了。

数组名与数组指针变量的区别

区别:数组名是指针,类型是指向元素类型的指针,但值是指针常量,声明数组时编译器会为声明所指定的元素数量保留内存空间。数组指针是指向数组的指针,声明指针变量时编译器只为指针本身保留内存空间。

指针数组(存放指针的数组)

指针数组:一个存放int类型的数组称为整型数组,那么存放指针的数组就叫指针数组。

#include<stdio.h>  
void main()  
{  
    int i=1,j=2;//p先跟[]结合,然后再跟*结合  
    int *p[2];//指针数组,存放指针的数组  
    p[0]=&i;  
    p[1]=&j;  
    printf("%d",sizeof(p));  
    }

此例数组p就两个元素,p[0]是指向i的指针,p[1]是指向j的指针。这两个指针都是int型指针,所以p是存放int型指针的数组。sizeof(p)返回数组占用的总空间,所以程序输出是8

常用举例

字符排序,可以用指针数组指向不字符串,排序时改变指针指向就避免了大量文本数据的移动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值