群里问题汇总

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\n", (*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

posted @ 2016-07-17 00:11  I'MJACKY  阅读(476)  评论(0编辑  收藏  举报