lam*_*kie 6 c arrays pointers coding-style
根据" 将数组和数组指针传递到C中的函数之间的区别",这两种声明参数的方式之间没有语义差异,因为"数组参数被视为被声明为指针".
void f1(int a[]) { /* ... */ }
void f2(int* a) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
但是,处理数组和指针之间存在很大差异.例如,可以使用找出数组的大小sizeof(some_array).但是,在处理指针时,这只会显示指针本身的大小.(旁注:关于这个问题,这是一个非常巧妙的解决方法.)
这就是为什么我发现声明这样的参数会产生误导:f1(int a[]).正如djechlin在" 数组和指针之间的差异作为函数在c中的参数 "中所指出的那样,我认为它可以让人们认为一个人实际上是在处理数组而不仅仅是指针:"因此我总是喜欢指针形式,因为阵列形式可能导致微妙的混乱."
话虽这么说,我想知道为什么人们继续使用"阵列形式",因为似乎没有理由这样做.我在这里错过了什么?在他的书" 学习艰难的道路"中,Zed Shaw实际上混合了两种方式:
void print_arguments(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
他们也在K&R2中做到了.
为什么?我熟悉不这样做的原因,但有哪些优点呢?
哪一个比较容易理解:
char *argv[] is intended to be an array of pointers to chars
Run Code Online (Sandbox Code Playgroud)
或者
char **argv is a pointer to a pointer to a char
Run Code Online (Sandbox Code Playgroud)
是的,您可以以非直观的方式编写 C 代码,但为什么要这样做呢?
你喜欢哪个:
a[2]
*(a + 2)
*(2 + a)
2[a]
Run Code Online (Sandbox Code Playgroud)
都有相同的效果。[]当它只是语法糖时为什么要使用它?因为它更具可读性。同样的道理:(*ps).member可读性不如ps->member