zoukankan      html  css  js  c++  java
  • 群里问题汇总

    1.请问buf的地址与&buf的地址的关系 &buf+1 =?

    ZB~E]MFVKE92V56B)$OK6MC 这道题大家可能会让大家有点晕,至少我是的,因为我们平时都是buf+1这种写法,如果你是第一次接触这种写法的话,其实大家只要把数组考虑成普通变量就行了,给大家举个例子

    int a = 0;

    int *p = &a+1;

    这里的&a大家是不是感觉很正常,就是这样,那么现在我们反过来,&buf就是取数组的地址,

    大家都知道&a+1 是代表a的地址加上四个字节,那是因为a是int型的,占四个字节,所以加上4个字节,那么&buf地址再加1就是加上buf变量的大小,buf是10个char元素数组,所以&buf + 1就相当于buf的地址加上10*1(char型的大小)

    上面 只是帮助你理解,如果纯粹从代码的角度来说,

    &buf的地址类型为 char (*p)[10] 相当于行指针的类型 ,那么p+1就相当于p的地址加上10*1个字节。

    2 阿南的c题目

    int a=3,b;
    b=++a+(++a)+(++a);
    printf("%d",b); 

    这道题在windows下与linux下的结果不同,但是我个人支持linux下gcc编译的结果16,windows下为18,编译器的不同,解释就不同,

    下面解析一下linux下为什么为16?

    不知道大家数据结构课的时候有没有写过表达式计算,其中有一种实现就是用两个栈来表示,一个栈用来表示运算符,另一个表示操作数。b = ++a + (++a) + (++a)

    首先++入栈 如下图(编译器是从左往右一个个字符读取的 所以a先入栈)

    image

    然后a入栈

    image

    这时候会继续往后面读取 发现是一个+号,因为加号优先级比++小,所以先执行++a

    这时候会把++弹出栈,a弹出栈,再把++a的结果压栈,+号压栈,

    这里一定要注意是把++a的结果虽然是4但是由于++a返回的是引用,所以压栈放的是a这个变量,而不是4

    image

    然后继续执行后面的(++a),这里是一样的,我就不详解释,当把第一个(这里的第一个值得是第一个带括号的++a)(++a)运算完毕之后,会继续读取后面的+号,这时候发现栈里面已经有了一个加号,优先级一样,按照c语言运算符+号的运算方向,从左往右,所以先运算栈里面的加号此时栈里面的情况如下图:

    image

    这时候执行了两次++a,a的值已经变为5了,所以这时候两个a相加等于10,这时候运算结束之后,将10压入栈,(注意这里压栈的就是10不像之前压栈的是a这个变量

    结束之后栈如下

    image

    后面再次执行++a 同样先计算++a,再将a的值压入栈中,在执行加法:

    image

    a的值变为6了 所以最后结果为16.

    下面这幅图是windows下的结果,编译器的不同。

    $X4HA091NZK`V5RLF_QN@P8

    3.耗子的题目 很经典

    ATPOAG3NXWPP2{O2N~78218

    上面这个题目需要我们用到汇编语言栈帧的问题,在汇编中如果我们调用另一个函数,会使用call命令,call所做的事情第一个将下一条命令的地址压栈,然后jmp到调用函数的地址,这里还会设置,esp与ebp的知识,我在这知识提一下,因为栈帧的知识不是一两句能说清楚的,函数的第一句都会

    push ebp;这句是为了保护调用函数的栈帧,

    ebp地址上面是局部变量,

    所以(int*)(*(&p+1));得到就是保护的上一个函数的ebp栈帧。

    p-=1;得到就是a的地址

    *p = 520;这样就可以改变a的内容了。

    但是这个能不能运行成功跟gcc版本有关系。gcc4.8能运行并且能修改。

    `K4AJ4(PVBVGXH_CQA}`]MG

    4  java中静态代码块与直接在声明的时候初始化的优先级?

        java中实例代码初始化块{}与直接在声明的时候初始化的优先级?

    答案是一样,那个在前面那个就先执行

    5 这道题知识记录(*ptr)可以这样用(*ptr)[2])

    int a[][3] = {1, 2, 3, 4, 5, 6};
    int (*ptr)[3] = a;
    printf("%d %d ", (*ptr)[1], (*ptr)[2]);
    ++ptr;
    printf("%d %d ", (*ptr)[1], (*ptr)[2]);

    6阿南

    下面的能编译吗?gcc的版本不一样造成不同结果,gcc5.几版本 编译不通过

    这里涉及前加加与后加加哪个返回引用的问题,以及贪心词法(C语言缺陷与陷阱)

    我记录一下我的看法,a++返回临时变量 这时候不能再对这个临时变量进行后加加,因为它不是左值

    int a = 1;
    int b = 2;
    int c = a+++++b;

    %3KK5OLK[6QTSU]22~7SPLK

    ~S@UIZXE]C3QL27%BQ)%V{N

    7 java二维数组初始化

    34GZ`V]_M~2V1`MHZ{}K48U

  • 相关阅读:
    枚举工具类:封装判断是否存在这个枚举
    MYSQL插入emoji报错解决方法Incorrect string value
    文件大小转换带上单位工具类(文件byte自动转KBMBGB)
    mysql 统计七天数据并分组
    mybatis plus 和 druid 版本导致LocalDateTime 不兼容问题
    Layui弹框中select下拉列表赋值回显
    查看环境版本
    Linux 常用命令
    安装jdk14的坑
    modbus_tk解析
  • 原文地址:https://www.cnblogs.com/shanchuan04/p/5677592.html
Copyright © 2011-2022 走看看