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

群里问题汇总 这道题大家可能会让大家有点晕,至少我是的,因为我们平时都是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先入栈)

群里问题汇总

然后a入栈

群里问题汇总

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

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

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

群里问题汇总

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

群里问题汇总

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

结束之后栈如下

群里问题汇总

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

群里问题汇总

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

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

 

群里问题汇总

3.耗子的题目 很经典

 

 

 

群里问题汇总

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

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

ebp地址上面是局部变量,

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

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

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

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

 

群里问题汇总

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\n", (*ptr)[1], (*ptr)[2]);

 

6阿南

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

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

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

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

群里问题汇总

群里问题汇总

 

7 java二维数组初始化

群里问题汇总

相关文章:

  • 2021-10-02
  • 2021-07-09
  • 2021-09-01
  • 2022-12-23
  • 2022-01-24
  • 2021-07-07
  • 2021-07-27
猜你喜欢
  • 2021-05-21
  • 2022-12-23
  • 2021-08-06
  • 2022-12-23
  • 2021-05-30
  • 2022-02-24
相关资源
相似解决方案