锁定老帖子 主题:C语言中的多级指针
精华帖 (2) :: 良好帖 (4) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-06-29
rain2005 写道 ray_linn 写道 seen 写道 ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 恩,你们公司就需要你这种没理解力的员工,生产点山寨路由。 char* argv[]的确是比char **argv好理解,不过作为函数参数还是应该是char **argv把,char* argv[]适合全局或者局部变量的地方。 ......[]这个东西明显是为了传参数的时候用的么。。。 因为C把数组转换成*来传参数。。。而*的话,就看不出是数组了,于是只能用[]表示,说我是个数组。。。 而不是一个指针的指针。。。 |
|
返回顶楼 | |
发表时间:2009-06-29
mikeandmore 写道 rain2005 写道 ray_linn 写道 seen 写道 ray_linn 写道 看到有人把char* argv[]写成char **argv,我就想拿本书往他头上劈头盖脑的打下去。
char* argv[]原来是多么好理解的事情,非得弄复杂了。。。 连着两个*就是把问题搞复杂了...呵呵...攒机器的公司也就只请得到这种水平的员工了 恩,你们公司就需要你这种没理解力的员工,生产点山寨路由。 char* argv[]的确是比char **argv好理解,不过作为函数参数还是应该是char **argv把,char* argv[]适合全局或者局部变量的地方。 ......[]这个东西明显是为了传参数的时候用的么。。。 因为C把数组转换成*来传参数。。。而*的话,就看不出是数组了,于是只能用[]表示,说我是个数组。。。 而不是一个指针的指针。。。 真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。 |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
rain2005 写道 真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。 一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。 一般程序员:写机器能理解的程序 高级程序员: 写别人能了解的程序。 |
|
返回顶楼 | |
发表时间:2009-06-29
ray_linn 写道 rain2005 写道 真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。 一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。 一般程序员:写机器能理解的程序 高级程序员: 写别人能了解的程序。 按照你的理解设计unix系统函数的人都是一般程序员:写机器能理解的程序 |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
rain2005 写道 ray_linn 写道 rain2005 写道 真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。 一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。 一般程序员:写机器能理解的程序 高级程序员: 写别人能了解的程序。 按照你的理解设计unix系统函数的人都是一般程序员:写机器能理解的程序 如果有,那么请用人“更容易”理解的写法,如果你还记得以后这些程序需要后人维护的话。 |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
rain2005 写道 真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。 type_t xxx[], 和 type_t* xxx在传参数的时候是一样的。。。效果是一样的。 用不用[]取决于coding convention问题。。。 至于[]用不用。。。 gnome.org的代码和Linux下的man page里面全是int main(int argc, char* argv[])的。。。不信自己去看。 所以,这个用不用[]仅仅是说[]提供了这个东西,爱用不用随便。。。 BTW 内核里面和“数组”(我是说汉语里的数组)打交道应该不多吧。。。 |
|
返回顶楼 | |
发表时间:2009-06-29
在mikeandmore,ray_linn两位强力纠正下我终于认识到了自己的错误,int main(int argc, char* argv[])确实是更好的方式,但是type_t xxx[]作为参数的情况下我并不任务比type_t* xxx好,毕竟这根本没有复杂性而言,type_t* xxx抽象性更好,参数可以具体为队列,数组等。
|
|
返回顶楼 | |
发表时间:2009-06-29
rain2005 写道 在mikeandmore,ray_linn两位强力纠正下我终于认识到了自己的错误,int main(int argc, char* argv[])确实是更好的方式,但是type_t xxx[]作为参数的情况下我并不任务比type_t* xxx好,毕竟这根本没有复杂性而言,type_t* xxx抽象性更好,参数可以具体为队列,数组等。
嗯。还是那句话。。。[]提供了这种功能,用不用看个人喜好,和团队coding convention。 比如solaris里面,为了清晰从来是不传type_t* xx[]的。原因好像有说在solaris里面**的指针仅仅表示二位数组。 所以么。convention就是这样啦 |
|
返回顶楼 | |
发表时间:2009-06-29
最后修改:2009-06-29
mikeandmore 写道 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) gcc 3.4.4 通过并正确运行,但是 gcc-4 不行。 [][] 很糟糕,以后不写这样的了 …… http://www.unix.com/unix-advanced-expert-users/112374-gcc-4-error.html http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_047.html |
|
返回顶楼 | |
发表时间:2009-06-29
night_stalker 写道 mikeandmore 写道 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) gcc 3.4.4 通过并正确运行 …… 回去帖 configure 那个啥。。如果这样都可以的话。。。 argv[1][1]的地址是多少。。。@_@ |
|
返回顶楼 | |