前几天帮别人解决数组拼接问题(类似字符串拼接)时想到这个专题。因为她的代码太糟糕。
我们知道C、C++中的数组是没有拷贝(复制)运算的,除非编译器支持。因为C语言发明的初衷是替换汇编语言,要知道你用不同指令集的机器就要用不同的汇编语言。。。(此处省略800字议论文)
我们想一想,当我们声明定义一个数组时,定义了数组的哪些
int array[10] = {0};
从上面的代码中我们可以得知数组的类型是int
, size是10
。
所以我们使用参数传递函数时,就必须将类型
和大小
两个信息传递给函数。
C语言有两种方式可以实现:
字符串数组:
我们知道C语言中的字符串其实就是字符串(const char *str = "PHP IS THE BEST!";
)数组。并且初学这也知道字符串是以\0
结尾的。
对于字符串数组,通常\0
后面的数据都不重要啊。
我们只需要把数组的地址(same as第一个元素的地址)传递给函数。
如果我们需要字符数组的size(其实不是size,确切的说是length),只需要strlen
函数即可(后面的数据who cares)。
char str[20] = "hello world";
void function(char *str);
void function2(const char *str);
其他的数组:
对于其他数组我们只需要传递数组的第一个元素和数组的长度即可。
int array[10] = {0};
void function(int *arr, int size);
void function2(const int *arr, int size);
void function3(const int arr[], int size);
void function4(int arr[], int size);
当然调用的时候可能并不需要整个数组:
function3(array+1, 5);
这种情况就需要注意指针不要变成野指针。
可以参考我初学C++时候的文章
你以为就这样结束了吗?
在C++中还有一种类型叫做引用。引用也可以传入函数。
void output(int n) {cout << n << ' ';}
void print(const int (&array)[10]) {
for_each(array, array+10, output);
}
int main(int, char **) {
int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
print(array);
return 0;
}
即使我们在print
函数中使用sizeof
也是能得到期待结果的。
但是我们可以明显的看到,我们函数声明中。引用的参数限定了数组的大小。也就是说不能动态的规定数组的大小。这就显得数组的引用
非常鸡肋了。
总的来说,呵呵不是不会写的。
网友评论