今天自己写卷积神经网络的时候用到了数组,忘了怎么用了怎么把数组传到函数里了。又复习了一遍。顺便记下来一边日后再次往~
详细代码省略了,就把结构写下:
void fun1( unsigned char array[9] ) { //.... } int main(int argc, char* argv[]) { <pre name="code" class="cpp"> unsigned char <span style="font-family: Arial, Helvetica, sans-serif;"> array[9] = {1,0,1,0,1,0,1,0,1};</span>fun1(array);}
下边的代码是错的
void fun1( <span style="font-family: Arial, Helvetica, sans-serif;">unsigned char </span>*array ) { //.... } int main(int argc, char* argv[]) { <pre name="code" class="cpp"> unsigned char <span style="font-family: Arial, Helvetica, sans-serif;"> array[9] = {1,0,1,0,1,0,1,0,1};</span>fun1(array);} 错误信息是:
candidate function not viable: no known conversion from 'unsigned char (*)[9]' to 'unsigned char *' for 3rd argument;
①
数组是数组,元素指针是元素指针,两个是不同的东西,
但是数组的指针和数组第一个元素的指针的值显然一样啊!但是指针的类型不一样(移动的步长不一样!数组指针移动一个位置的话,就跳过了整个数组,元素指针移动一个位置,仅跳过一个元素)。
②
指针和数组名的共同特点是都是用来指代一个地址的。
不同的是:
1、指针是需要占用内存空间来存储地址的;数组名则更像是一个 立即数或者常数。你可以修改指针指向的内容,但你绝对无法改变数组名的指向。
2、数组和指针对于sizeof来说是不同的,指针变量占用的空间 通常等于当前CPU的最大位数,数组名取sizeof的话,得到的则是数组的大小。
3、如果用extern声明一个外部变量,指针和数组不能混用。比如在文件1.cpp里声明了char ca[]="abcde",在文件2.cpp里如果要引用,那么必须是extern char ca[]而不是extern char * ca,因为前者是常数,后者是一个占用了内存空间的有效的变量,区别还是很大的。
4、对数组名取地址&是合法的,但有些编译器不推荐这样做,对数组名取地址的结果与直接使用数组名的结果是一致的,这是C语言的一种特殊规定。有一个类似的效果就是函数名,假如func1是一个函数名,那么*func1==&func1==func1,这只是特殊用法,不代表函数名/数组名真的可以这么做。
(知乎中的原文:https://www.zhihu.com/question/23059655)
不同的是:
1、指针是需要占用内存空间来存储地址的;数组名则更像是一个 立即数或者常数。你可以修改指针指向的内容,但你绝对无法改变数组名的指向。
2、数组和指针对于sizeof来说是不同的,指针变量占用的空间 通常等于当前CPU的最大位数,数组名取sizeof的话,得到的则是数组的大小。
3、如果用extern声明一个外部变量,指针和数组不能混用。比如在文件1.cpp里声明了char ca[]="abcde",在文件2.cpp里如果要引用,那么必须是extern char ca[]而不是extern char * ca,因为前者是常数,后者是一个占用了内存空间的有效的变量,区别还是很大的。
4、对数组名取地址&是合法的,但有些编译器不推荐这样做,对数组名取地址的结果与直接使用数组名的结果是一致的,这是C语言的一种特殊规定。有一个类似的效果就是函数名,假如func1是一个函数名,那么*func1==&func1==func1,这只是特殊用法,不代表函数名/数组名真的可以这么做。