wutheringcoo 2019-01-29 20:29 采纳率: 0%
浏览 565

有关C++多维数组指针的问题

下面几个输出都有什么区别呢?傻傻分不清。

#include <stdio.h>
#include<stdlib.h>

using namespace std;

int main(int argc, char* argv[])
{
    int v[2][10] = {
        {1,2,3,4,5,6,7,8,9,10},
        {11,12,13,14,15,16,17,18,19,20}
        };
    int (*a)[10] = v;
    printf("**a = %d\n", **a);
    printf("**(a+1) = %d\n", **(a+1));
    printf("*(*a+1) = %d\n", *(*a+1));
    printf("*(a[0]+1) = %d\n", *(a[0]+1));
    printf("*(a[1]+1) = %d\n", *(a[1]+1));
    printf("*(a[1]) = %d\n", *(a[1]));
    return 0;
}

  • 写回答

1条回答 默认 最新

  • xyzhuo 2019-01-29 21:30
    关注

    我们说数组名相当于指向数组第一个元素的指针,这个一位数组的时候应该比较好理解。
    理解多维数组也一样,例子中二维数组v[2][10], 该二维数组可以理解为包含两个元素v[0], v[1] , 其每个元素都是一个包含“10个整型元素”的数组,
    该二维数组的第一个元素是v[0],是一个包含了“10个整型元素”的数组;
    a 对应数组名v, 指向数组第一个元素的指针, 想象指向的范围是第一整行;
    a+1 指向数组第二个元素,指向的范围是第二整行;
    *a : 对应的是指向第一行第一个元素的指针,指向范围是第一行第一个元素;
    **a*a 基础上再取*, 那么就是第一行第一个元素的值1;同理**(a+1)是返回第二行第一个元素的值11;
    *a+1 是指向第一行第一个元素的指针加1,那么就是指向第一行第二个元素的指针,*(*a+1)就是第一行第二个元素的值2;
    a[0]是指向第一行第一个元素的指针,a[0] +1 就是指向第一行第二个元素的指针,*(a[0]+1) 返回值2;
    a[1]是指向第二行第一个元素的指针,*(a[1])返回值11;a[1] +1 是指向第二行第二个元素的指针,*(a[1]+1) 返回值12;

    结果:

     **a = 1
    **(a+1) = 11
    *(*a+1) = 2
    *(a[0]+1) = 2
    *(a[1]+1) = 12
    *(a[1]) = 11
    

    简单点可以试着这么理解:二维数组名指向的是第一行整行(二维数组的第一个元素),加*以后"降"一级,指向的是该行中的第一个元素,再加*,指向内容:值。

    • a&a[0]等价;
    • a[0]&a[0][0]等价;
    • a[0]*a 等价;
    • a[0][0]**a等价;

      不知道有没有讲明白,希望能有帮助。

    评论

报告相同问题?

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突