锁定老帖子 主题:C语言中的多级指针
精华帖 (2) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-29
最后修改:2009-06-29
abruzzi 写道 oxromantic 写道 没有用到&,指针基础才涉及一半,
而且不考虑初级还是高级,希望LZ过一年再来看自己的代码,能写出这种内存使用代码的人也能如此狂妄,怪不得开源社区一直高质量代码百分比不高,原来多亏LZ你啊 大侠,你看完帖子了没有就在这儿喊?如果是看完了,那只能说你不识字了,我早就说明那个是《UNIX系统编程》中的一个例子,写的很好,所以贴出来大家学习下。不是我写的,再说了,说这个代码写的烂的人只不过是在暴露自己不学无术的真面目而已。 已经说了,文章的题目起的有点大了,例子给的比较简单,不好意思。 向你这样半吊子而且狂妄的人不多了 复制一段代码: void freemakeargv(char **argv) { if (argv == NULL) return; if (*argv != NULL) free(*argv); free(argv); } 请问这个代码在你的测试里有涉及吗? 非得我挑明了说,真是笑话 |
|
返回顶楼 | |
发表时间:2009-06-29
oxromantic 写道 向你这样半吊子而且狂妄的人不多了 复制一段代码: void freemakeargv(char **argv) { if (argv == NULL) return; if (*argv != NULL) free(*argv); free(argv); } 请问这个代码在你的测试里有涉及吗? 非得我挑明了说,真是笑话 笑话?不知道好笑在哪儿?好像加入free了就牛B了似的。主题是多级指针的操作,不是面向内存保护,当然,这段代码确实属于严格的写法,之所以没有写出来不是因为其不重要,而是在这个例子中不重要。 另:我的半吊子不半吊恐怕还轮不到你说,至于狂妄,在下还真是不敢,草莽之间,卧虎藏龙之辈正不知有多少,哈哈。 |
|
返回顶楼 | |
发表时间:2009-06-29
最近linux内核代码看的比较多,看了大家好多的发言,感觉大家对指针的概念还比较模糊,其实要弄清楚指针怎么回事必须和汇编指令结合起来,比如汇编编译后的机器指令是没有指针的概念的,指针就是地址,不同类型的指针就是地址指向的内容或者说大小(字节)不同而已,多重指针也很好理解,就是指针变量指向的内容还是地址。说到指针有人就会拿来和数组比较,其实数组是C抽象的概念,到编译器那里全变成了指针。只不过是一段连续的存储单元。说了这么多可能大家都明白,推荐大家看下《深入理解计算机系统》第3章,看看C是编译成汇编是怎么回事对指针的理解会更加深刻。
|
|
返回顶楼 | |
发表时间:2009-06-29
rain2005 写道 最近linux内核代码看的比较多,看了大家好多的发言,感觉大家对指针的概念还比较模糊,其实要弄清楚指针怎么回事必须和汇编指令结合起来,比如汇编编译后的机器指令是没有指针的概念的,指针就是地址,不同类型的指针就是地址指向的内容或者说大小(字节)不同而已,多重指针也很好理解,就是指针变量指向的内容还是地址。说到指针有人就会拿来和数组比较,其实数组是C抽象的概念,到编译器那里全变成了指针。只不过是一段连续的存储单元。说了这么多可能大家都明白,推荐大家看下《深入理解计算机系统》第3章,看看C是编译成汇编是怎么回事对指针的理解会更加深刻。
不是每个人可以轻松的阅读Linux内核这样的大工程的,当然有能力读会对C理解的很深入,我的意思是最好通过一些小的例子来说明一些原理,这样对以后学习大型的项目有很大的帮助。 内核中的一个文件,对外部的依赖肯定是千丝万缕的,不容易上手,呵呵。 |
|
返回顶楼 | |
发表时间:2009-06-29
abruzzi 写道 rain2005 写道 最近linux内核代码看的比较多,看了大家好多的发言,感觉大家对指针的概念还比较模糊,其实要弄清楚指针怎么回事必须和汇编指令结合起来,比如汇编编译后的机器指令是没有指针的概念的,指针就是地址,不同类型的指针就是地址指向的内容或者说大小(字节)不同而已,多重指针也很好理解,就是指针变量指向的内容还是地址。说到指针有人就会拿来和数组比较,其实数组是C抽象的概念,到编译器那里全变成了指针。只不过是一段连续的存储单元。说了这么多可能大家都明白,推荐大家看下《深入理解计算机系统》第3章,看看C是编译成汇编是怎么回事对指针的理解会更加深刻。
不是每个人可以轻松的阅读Linux内核这样的大工程的,当然有能力读会对C理解的很深入,我的意思是最好通过一些小的例子来说明一些原理,这样对以后学习大型的项目有很大的帮助。 内核中的一个文件,对外部的依赖肯定是千丝万缕的,不容易上手,呵呵。 既然说到linux内核的阅读,其实现在的Linux内核确实复杂到了难以想象的地步,不过Linux 0.01却不到3万行代码,而且选对书也很重要了,我看的是《linux内核完全剖析》,用了2个半月查不多看完了,当然前期的知识准备过程还有2个月,其中就包括《深入理解计算机系统》这本书,其实如果是专业C开发人员的话理解内核对大型项目我感觉还是很重要的,更何况我一个java程序员学习了内核之后对线程,并发有了新的理解,当然这只是一小块收获。 |
|
返回顶楼 | |
发表时间:2009-06-29
night_stalker 写道 星号经常会导致一些 syntax error,得弄很多 typedef 才行 ……
LPCSTR argv[] …… 其实 char[][] 是可以的 …… 至少 gcc 可以 #include <stdio.h> int main(int argc, char argv[][]) { printf("%s\n", ((char**)argv)[0]); return 0; } mikeandmore% gcc test.c test.c:2: error: array type has incomplete element type mikeandmore% gcc -v Using built-in specs. Target: i486-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.3-13' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu Thread model: posix gcc version 4.3.3 (Debian 4.3.3-13) |
|
返回顶楼 | |
发表时间:2009-06-29
ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 ![]() |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
seen 写道 ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 ![]() 恩,你们公司就需要你这种没理解力的员工,生产点山寨路由。 |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
ray_linn 写道 seen 写道 ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 ![]() 恩,你们公司就需要你这种没理解力的员工,生产点山寨路由。 char* argv[]的确是比char **argv好理解,不过作为函数参数还是应该是char **argv把,虽然说编译器会把char* argv[]当成char **argv,char* argv[]适合全局或者局部变量的地方。 |
|
返回顶楼 | |
发表时间:2009-06-29
seen 写道 ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 ![]() 就拿微软这种从来不重视code review的公司说事。。。 变量名写错了都打回来重写,何况出现这么多*。。。。 |
|
返回顶楼 | |