• C语言二元数组(一腾讯笔试题想到的)


    #include <stdio.h>
    #include <stdlib.h>
    
    int getItem(int *a,int i,int j)
    {
        return *(a+i*3+j);
    }
    void add(int *p)
    {
        (*p)++;
    }
    int main()
    {
        int a[4][3]={{1,2,3},{4,5,6},{7,8,9},{12,13,14}};
        int b=6;
        add(&b);
        printf("%d\n%d\n%d\n",*(*(a+2)+1),getItem(a,2,1),b);
        return 0;
    }

    这是腾讯的一个笔试题,纠结了一段时间,终于想明白了。

    上面getItem函数很容易写成 return *(*(a+i)+j);这是错误的,为什么呢?因为形参是 int *a;所以指针变量a赋值给a后,它变成了int型的指针,每次加1相当于内存地址中加4,所以要用return *(a+i*3+j);其实二维数组里面a和a[0]地址是一样的,但是性质不一样,a是数组指针的首地址,a[0]是第一行数据的首地址,*(a+1)=a[1];这个公式和一维数组一样。

    如果还不懂,就看下面这个例子:

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

    输出结果全是5,即a[1][1]的值。你都能看懂吗?对于指针变量p,相当于 int *p=(int *)a;强制转换一下。对于pp指针变量,则正好和a效果是一样的。
    共勉。

  • 相关阅读:
    深入理解Java内存模型(JMM)
    Java基础知识①
    Java自旋锁的几种实现
    ConcurrentHashMap的CAS操作
    Java集合对比总结
    python模块--os模块
    python模块--random
    Datafactory 学习笔记
    Datafactory 实际使用案例
    Oracle三种排名函数使用
  • 原文地址:https://www.cnblogs.com/nannanITeye/p/3133292.html
Copyright © 2020-2023  润新知