为什么将指针传递给采用指针的函数是错误的
Why is it wrong to pass a pointer to a function taking a pointer?
#include<iostream.h>
#include<conio.h>
void print(char *str){
cout<<str;
}
int main(){
clrscr();
char str[]="abcdef";
print(&str);
getch();
return 0;
}
错误
1. 无法将"字符[7]"转换为"字符 *">
2.在调用打印时参数"str"中键入不匹配(字符*(
由于函数打印的参数列表由指针组成,因此在函数调用中传递 &str 应该是正确的
此外,如果我删除"&",程序运行良好(即使打印功能需要字符引用(。
由于函数打印的参数列表由指针组成,因此在函数调用中传递
&str
应该是正确的
这并不完全正确:仅仅传递任何指针是不够的,它需要是正确的类型。 &str
是指向数组的指针,而您需要指向单个数组元素的指针。
由于 中的数组在传递给函数时C++"衰减"到指针,因此您需要做的就是删除与号:
print(str);
如果我删除
&
程序运行良好(即使打印功能需要字符引用(
没错!数组名称(在本例中为 str
(被隐式转换为指针,指针等于指向数组初始元素的指针。换句话说,它和写作一样
print(&str[0]);
print(&str);
是错误的,因为&str
的类型是char (*)[7]
,而预期的参数类型是char*
。
为了说明这两种类型之间的区别:
char str[]="abcdef";
char (*ptr1)[7] = &str; // Take the address of the array.
char* ptr2 = str; // Use the array variable. It decays to a pointer
*ptr2 = 'A'; // OK.
*ptr1 = 'A'; // Not OK.
(*ptr1)[0] = 'A'; // OK
这样直接将str
传递给print()
:
// this already provides std::cout
#include<iostream.h>
// this is unnecessary
//#include<conio.h>
// you could do this to avoid std:: everywhere:
//using namespace std;
void print(char *str){
// don't forget the namespace:
std::cout<<str;
}
int main(){
clrscr();
char str [] = "abcdef";
// no "&", just pass str
print (str);
getch();
return 0;
}
C/C++ 中的数组只是指向数组第一个元素的指针。
http://www.cplusplus.com/forum/articles/9/
函数print
声明为具有类型为char *
的参数
void print(char *str){
cout<<str;
}
在 main 中,它使用类型 char ( * )[7]
的参数调用,因为表达式&str
具有这种类型。
char str[]="abcdef";
//...
print(&str);
你应该简单地调用该函数,就像
print( str );
在这种情况下,数组将转换为指向其第一个字符和表达式的指针str
其类型为 char *
例如,当您有一个类型 T
的数组时
T a[10];
然后,表达式中使用的数组将转换为指向其第一个元素的指针。例如这个
T *ptr = a;
是一个正确的声明。
另一方面,如果您使用的是表达式&a
则指针的正确声明将如下所示
T ( *ptr )[10] = &a;
也就是说,在本例中,ptr 是指向类型为 T[10]
的对象的指针
我建议使用更现代的编译器:)
- 为什么我在空指针错误(链表)中获取成员访问权限
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 为什么我得到 munmap_chunk():无效的指针:错误
- 成员模板函数指针错误
- 删除指针时,未分配被释放的 C++ 指针错误
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- C++数组指针错误无法将“int*”转换为“int**”
- C++ 通过函数指针错误调用成员函数
- 从 BST 中删除元素(指针错误)
- 随机生成的多维布尔指针错误
- 在测试中使用unique_ptr时指针错误无效
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 抽象类和唯一指针 c++ 错误
- 返回函数指针错误而不带类型定义
- 练习中出现空指针错误
- 指针错误导致的分段错误(简单..)
- free():C++中的指针错误无效
- 使用布尔值数组"表达式必须具有指向对象类型的指针"错误C++
- 指针错误的C 数组