问题描述
定义一个函数,以数组为形参,函数体内部求出数组大小如下:
结果:无论定义多大的数组,最终函数体内输出的数组大小始终为**4*
# include
void fun ( char arr[ ] ) { printf ( "%d\n" , sizeof ( arr) ) ;
}
void main ( ) { char arr[ 9 ] ; printf ( "%d\n" , sizeof ( arr) ) ; fun ( arr) ;
}
原因
因为当数组作为实参进行传递时会自动**退化为指针**(是一种隐式转换),所以传入的是数组的首地址,作为
接收的形参char arr[]也会自动退化为 char *类型的指针,所以数组在进行传递时,传递的时数组的地址而不是
数组的元素。
解决方法
函数中需要数组大小时,需另声明一个形参来传递数组大小。如下:
# include
void fun ( char arr[ ] , int arrlencom) { printf ( "%d\n" , arrlencom) ;
}
void main ( ) { char arr[ 9 ] ; int arrlencom; arrlencom = sizeof ( arr) ; printf ( "%d\n" , arrlencom) ; fun ( arr, arrlencom) ;
}
仅在以下3种情况中,数组不会退化成指针
1.使用 sizeof(a) 的时候,所以上面 sizeof(a)(main函数中的) 的结果为9
2.对数组名取地址操作:&a,&a的类型为pointer to array of 6 chars,而对字符串指针取地址结果为
pointer to pointer to char.
3.使用字符串初始化数组时,也不会退化。
其他情况下,都会退化成”指向数组首元素的指针“(一维二维数组均是如此)
还有以下这种比较具有迷惑性
main函数中sizeof(arr + 1)中,数组也会退化成指针,arr+1,首地址+1.
void main ( ) { char arr[ 9 ] ; int arrlencom, sum; sum = arr+ 1 ; arrlencom = sizeof ( sum) ; printf ( "%d\n%p\n%p\n" , arrlencom, arr, sum) ; fun ( arr, arrlencom) ;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】 进行投诉反馈!