换马甲的数组

谨记一个真理:在c语言中,我们没有办法可以将一个数组作为函数参数直接传递
如果我们使用数组名作为参数,那么 数组名会立刻被转换为指向该数组第1个元素的指针
例如,下面的语句:

char hello[] = "hello";

声明了 hello 是一个字符数组。如果将该数组作为参数传递给一个函数,

printf("%s\n", hello);

实际上与将该数组第1个元素的地址作为参数传递给函数的作用完全等效,即:

printf("%s\n*, &hello[0]);

因此,将数组作为函数参数毫无意义。
所以,C语言中会自动地将作为参数的数组声明转换为相应的指针声明。也就是说,像这样的写法:

int strlen (char s[]) {
  /*具体内容*/
  return 0;
}

与下面的写法完全相同:

int strlen (char* s) {
  /*具体内容*/
  return 0;
}

下面这种写法:

extern char *hello;

与这种写法也完全相同。

extern char hello[];

数据的这种多样性定义,被某些编程者称为 最垃圾的设定,容易造成混淆错觉,却又没有什么意义。
但如果真要较真他们之间的差异,还是有的,例如:

int main(int argc, char* argv[]) {
  /*具体内容*/
  return 0;
}

int main(int argc, char** argv) {
  /*具体内容*/
  return 0;
}

上面一种写法,更加强调 argv 是一个字符串数组,而下面那种写法,更强调的是 argv 是一个字符的二维数组。编程者可以任选一种写法来 清晰反映自己的设计意图,这或许就是这个语言设计的初衷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值