指针数组基础讲解

指针数组

  • 所谓指针数组是指若干具有相同存储类型和数据类型的指针变量构成的集合
  • 指针数组的一般说明形式:
  • <存储类型><数据类型>*<指针数组名>[<大小>]
  • 指针数组名表示该指针数组的起始地址 声明一个指针数组: auto double *p[2],a[2][3];//定义一个一维指针数组、二维指针数组
  • 把一维数组a[0]和a[1]的首地址分别赋予指针变量数组的数组元素pa[0]和pa[1];
//二维指针数组赋值:
pa[0] = a[0];   //等价于pa[0] = &a[0][0];
pa[1] = a[1];   //等价于pa[1] = &a[1][0];

此时pa[0]指向了一维数组a[0]的第一个元素a[0][0];
而pa[1]指向了一维数组a[1]的第一个元素a[1][0]; 例:

#include<stdio.h>
int main()
{
    int * p[3];//含有三个指针p[0]、p[1]、p[2]
    int a[] = {1,2,3,4,5};
    p[0] = &a;
    p[1] = a+1;
    p[2] = a+2;
   
    printf("%d  %d  %d\n",*p[0],*p[1],*p[2]);
    return 0;
}

运行结果:

1  2  3

二维数组指针举例:

#include<stdio.h>
int main()
{
    int * p[2];//含有三个指针p[0]、p[1]、p[2]
    int a[2][3] = {{1,2,3},{4,5,6}};
    p[0] = a[0];
    p[1] = a[1];
    printf("%d\n",a[0][1]);
    printf("%d\n",*(a[0]+1));
    printf("%d\n",*(p[0]+1));
    return 0;
}

运行结果:

2
2
2

例:

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

运行结果:

0x7ffec8c40290 0x7ffec8c40290
0x7ffec8c4029c 0x7ffec8c4029c

验证的结果就是a[0] = p[0]。 例:打印二维数组中的元素并计算二维数组中所有元素的值。

#include<stdio.h>
int main()
{
    int a[2][3] = {{1,2,3},{4,5,6}};
    int * p[2] = {a[0],a[1]};
    int i ,j,sum = 0;
    for(i = 0;i<2;i++)
    {
        for(j = 0;j<3;j++)
        {
            printf("%d,%d ",*(a[i]+j),*(p[i]+j));
            sum+= (*(p[i]+j));   
        }
        puts("");
    }
    printf("sum = %d\n",sum);
    return 0;
}

运行结果:

1,1 2,2 3,3 
4,4 5,5 6,6 
sum = 21

总结与思考

  • 主要介绍了指着数组的用法,包括声明、初始化、赋值及指针数组如何访问二维数组等
    思考
  • 指针数组名加1,移动多少字节?
    移动4个字节
  • 指针数组名相当于什么样的指针?
    指针数组名称相当于一个二级指针。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值