指针数组和数组指针的不同处

在学习c语言的时候经常把指针数组和数组指针搞混,刚开始接触c语言指针的时候,基础不扎实,往往数组指针和指针数组这两个专业词组放在一起,从字意上就充满迷惑性,不好判断。那如何来区分数组指针和指针数组呢。其实数组指针只是一个指针变量,指向的是一个变量。强调的是后面的指针。顾名思义,指针数组则是强调后面数组两字,是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。在这基础上其实很容易区分二者的不同之处。往往在学指针的时候总觉得指针很绕,那下面我们来简单讲解一下二者的区别。

一.数组指针

(1).概念

当我们定义一个指针,然后把数组地址存放到指针里面,这时存放数组的指针就称为数组指针。也就是说数组指针是指向数组地址的指针;

示例1:

#include <stdio.h>
int main()
{
    int A[10] = {1,2,3,4,5,6,7,8,9,0};//声明一个数组
    int *p;//声明一个指针
    p = &A[0];//指向N数组的第一个元素
    printf("%d\n",*p);//输出指针P指向N数组的第一个元素N[0]
    return 0;
}

拓展:

这里我们示例中定义了一个指针变量P,这个指针变量保存的内容为A[0]的地址(其实也就是首地址A的地址);这就构成了数组指    针 。示例1可以改为指针味道较浓的写法:

    int *p = A;//声明一个指针指向N数组的首地址

这里*p = A,其实写全为*p = &*(A+0);一个取地址符&和取内容符*相互抵消,就等于*p = A;

二.指针数组

(1)概念:对指针数组来说,首先它是一个数组,数组的元素都是指针,也就是说该数组存储的是指针;它是一个存放指针的数组

示例2:

#include <stdio.h>
int main()
{ /*
    声明5个数组,并对这五个数组赋值
  */
    int b[5] = {1,2,3,4,5};
    int a[5] = {0,1,2,3,4};
    int c[5] = {2,3,4,100,6};
    int d[5] = {3,4,5,6,7};
    int e[5] = {4,5,6,7,8};
    /*
    声明5个指针变量,并对这五个指针变量赋地址
    */
    int *pa = a,*pb = b,*pc = c,*pd = d,*pe = e;

    int *P[5] = {pa,pb,pc,pd,pe};//声明一个指针数组;赋值为5个指针变量

    printf("%d\n",P[2][3]);//这里指针数组相当一个二维数组,输出100
    printf("%d\n",*(*(P+2)+3));//先取出指针数组P[2]的内容,为数组c的首地址,然后找到c数组的c[2]保存的值
    return 0;
}

拓展

printf("%d\n",*(*(P+2)+3));//先取出指针数组P[2]的内容,为数组c的首地址,然后找到c数组的c[2]保存的值

这里*(P+2)其实是找到指针数组P[2]的值,然而我们得弄清楚的是P[2]保存的内容是一个地址,是pc之前取的数组c地址,而和我们以往存的一个数是不一样的。所以才叫指针数组,然后还要找到c的首地址后3个数的值,所以用*(*(p+2)+3),等同于P[2][3]。

二位指针数组的赋值方式:(*P)[N];如下例:

#include <stdio.h>
int main()
{ /*
    声明二位数组,并对数组赋值
  */
    int arr[5][5] = {{1,2,3,4,5},
    {0,1,2,3,4},
    {2,3,4,100,6},
    {3,4,5,6,7},
    {4,5,6,7,8}};

    int (*p)[5] = arr;//声明一个二维数组指针,并且对二维数组指针赋值
    int i,j;
    for(i = 0;i < 5;i++)
    {
        for(j = 0;j < 5;j++)
            printf("%d\t",p[i][j]);
        printf("\n");
    }
    return 0;
}

 

总结

是数组指针就是指向数组的指针,指针数组就是存放指针的数组。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值