为什么我们不能将 &数组传递给 &array[0] 可能的功能
why cant we pass &array to function where &array[0] is possible
void fun(int* array){}
int main(){
int array[]={1,2,3};
fun(&array);----->(1)//error in this line
return 0;
}
error: cannot convert âint (*)[3]â to âint*â for argument â1â to âvoid fun(int*â).
如果我通过fun(&array[0])
,它工作正常。根据我的理解,&array
和&array[0]
都产生相同的地址。请澄清。
虽然任何聚合的地址(这意味着数组和标准布局类(都保证与第一个元素的地址相同,但类型是不同的,并且没有隐式转换。
举个例子,为什么不同类型的类型很重要和有用:
for( int *p = array; p < (&array)[1]; ++p )
遍历array
的所有元素,而
for( int *p = array; p < (&array[0])+1; ++p )
仅执行一次。
在 C++11 中,如果您运行以下命令:
#include<iostream>
template<class T>
void foo(T t) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
int main() {
int arr[] = {1,2,3};
foo(arr);
foo<decltype(arr)>(arr);
foo(&arr);
foo(&arr[0]);
}
它将产生以下结果:
void foo(T) [with T = int*]
void foo(T) [with T = int [3]]
void foo(T) [with T = int (*)[3]]
void foo(T) [with T = int*]
有趣的是,数组默认折叠成指针(不确定这是 gcc 行为还是预期(。 但是,第二行显示arr
的类型是int[3]
,因此&arr
是指向int[3]
的指针,与int*
不同。
它们不起作用,因为它们意味着不同的元素大小。索引一个int*
会增加它的地址sizeof(int)
,因为它索引成一个int
数组。索引一个int(*)[3]
会增加它的地址sizeof(int) * 3
,因为它索引成一个3个整数的数组数组。因此,即使起始地址相同,它们也是非常不同的类型,并且意味着非常不同的指针算法。编译器非常正确地告诉您它们不兼容。
数组在
传递时自然衰减为指针。您不必使用地址运算符。
您的类型不匹配。
该函数需要*int
(指向 int 的指针(。
array
和&array[0]
属于这种类型,*int
.
但&array
是 int(*)[3]
类型(指向 3 个整数数组的指针(。
试试这个:
void fun(int* array){} // int *array is integer pointer so it can point to int not the int pointer.
int main(){
int array[]={1,2,3};
fun(array); //remove &. now *array of pm point to array[0] i.e int.
return 0;
}
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- 当使用Char Array和= Operator启动字符串时,该功能被调用
- c++ 2d array显示功能
- 为什么我们不能将 &数组传递给 &array[0] 可能的功能