- 论坛徽章:
- 0
|
原帖由 converse 于 2006-2-28 10:20 发表
我指的是“纯 C 语言”其他一律非 C 语言知识的不算,包括和数据结构、算法、系统、网络有关的所有所有
C 语言就是简简单单的语法组成的,仅此而已
如果你认为这样就是你所谓的C语言,我觉得你对C的认识 ...
我是初学者。我试一试解释一下。不对的话请大家指正。
- 1.下面几个语句是什么意思:
- typedef int (*f)(void)[5];
- 答:
- 这个我也不知道是什么东西?是不是lz写错了。还是我孤陋寡闻。
- char *(*c[10])(int **);
- 答:
- 这个应该是函数指针的数组。
- 函数的原型是 char * func_name(int **)
- 如果你读过《c专家编程》,解析这个应该不是难事。
- 2.这个宏的含义是什么:
- #define OFFSET(structure, member) ((int) &((structure *)0)->member)
- 原理又是什么?
- 答:
- 这个宏应该是取得结构体内变量相对结构体起始位置的偏移量。
- 原理:
- 就是整数是可以跟指针变量相互转换的。
- 注:
- 我刚才看见某人说这个在c下编译通不过。只能在在c++下编译通过。
- 这纯属胡扯。是用的不对吧!
- printf("s1 = [%d]\n", OFFSET(struct data_s, s1));
- 编译通不过么?
- 3.从堆栈的角度给我解释一下为什么返回局部指针变量是危险的?
- 答:
- 这个问题就是复杂了,
- 进入函数前,都要建立当前函数的栈框架。
- 汇编指令:
- pushl %ebp
- movl %esp,%ebp
- 一个函数的返回,都要释放当前函数的栈框架。
- 汇编指令:
- leave //相当于:movl %ebp %esp
- popl %ebp;
- ret //函数返回
- 因为:movl %ebp %esp
- popl %ebp;
- 这两句指令,所以被调用函数的函数栈已经被释放了。现在的函数栈的调用函数的函数栈。
- 如果你返回一个指针并且该指针指向已经被释放的函数栈的变量地址,其结果将是无法预料的。
- 4.int t = (unsigned char)(-1);
- 此时t为多少?又是为什么呢?
- 答:
- 255
- 原因:
- 计算机中数值的标示统一为数值的补码
- -1的原码:
- 10000001
- -1的反码:
- 11111110
- -1的补码
- 11111111
- 那么11111111表示的unsigned char类型的数值是多少。大概大家都知道吧。
- 注:我不知道为什么有人说这不符合标准。难道标准连这样基本的东西都不支持么?
- 还是根本不知道怎么回事,在这里故作高深。
- 5.C中到处存在的指针强制转换,它的原理又是什么呢?为什么我这样做没有问题:
- int t = 1;
- void *p = (void*)&t;
- int *p1 = (int *)p;
- 这里,t的指针经过几次转换,到p1的时候还是能够正确的读出数值,为什么?
- 答:
- 指针的强制类型转换的原理:
- 指针实质就是:内存的地址+内存中数据类型解释(即:指针的步长)
- 指针的强制类型转换对内存的地址是不会改变的,改变的就是对内存中数据的类型解释。
- 如果明白这个原理,
- 上面的问题的答案就是不得而知了。
复制代码 |
|