论坛首页 编程语言技术论坛

C语言中的多级指针

浏览 27195 次
精华帖 (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把数组转换成*来传参数。。。而*的话,就看不出是数组了,于是只能用[]表示,说我是个数组。。。
而不是一个指针的指针。。。
0 请登录后投票
   发表时间: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[]作为参数只能说明你惧怕指针,根本没有真正理解指针。
0 请登录后投票
   发表时间:2009-06-29   最后修改:2009-06-29
rain2005 写道

真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。



一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。

一般程序员:写机器能理解的程序

高级程序员: 写别人能了解的程序。
0 请登录后投票
   发表时间:2009-06-29  
ray_linn 写道
rain2005 写道

真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。



一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。

一般程序员:写机器能理解的程序

高级程序员: 写别人能了解的程序。

按照你的理解设计unix系统函数的人都是一般程序员:写机器能理解的程序
0 请登录后投票
   发表时间:2009-06-29   最后修改:2009-06-29
rain2005 写道
ray_linn 写道
rain2005 写道

真是服了你了,这居然是你使用数组参数的原因,你去看看内核源码和标准库代码有使用char* argv[]作为参数的地方么?如果一个专业的程序员连指针的指针都理解不了那还干程序员干嘛?用char* argv[]作为参数只能说明你惧怕指针,根本没有真正理解指针。



一个程序员把本来容易理解的东西,故意写得难一点,那就是故弄虚玄,水平有限。

一般程序员:写机器能理解的程序

高级程序员: 写别人能了解的程序。

按照你的理解设计unix系统函数的人都是一般程序员:写机器能理解的程序


如果有,那么请用人“更容易”理解的写法,如果你还记得以后这些程序需要后人维护的话。
0 请登录后投票
   发表时间: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 内核里面和“数组”(我是说汉语里的数组)打交道应该不多吧。。。
0 请登录后投票
   发表时间:2009-06-29  
在mikeandmore,ray_linn两位强力纠正下我终于认识到了自己的错误,int main(int argc, char* argv[])确实是更好的方式,但是type_t xxx[]作为参数的情况下我并不任务比type_t* xxx好,毕竟这根本没有复杂性而言,type_t* xxx抽象性更好,参数可以具体为队列,数组等。
0 请登录后投票
   发表时间: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就是这样啦
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间: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]的地址是多少。。。@_@
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics