#include<iostream.h>
#include<conio.h>
void print(char *str){
cout<<str;
}
int main(){
clrscr();
char str[]="abcdef";
print(&str);
getch();
return 0;
}
错误的
1.无法将'char [7]'转换为'char *'
2.在调用print(char *)
由于函数print的参数列表由一个指针组成,因此在函数调用中传递&amp; str 应该是正确的
如果我删除'&amp;'程序运行正常(即使打印功能需要字符引用)。
答案 0 :(得分:7)
由于函数print的参数列表由一个指针组成,因此在函数调用中传递
&str
应该是正确的
这并不完全正确:只传递任何指针是不够的,它需要是正确的类型。 &str
是指向数组的指针,而您需要指向单个数组元素的指针。
因为C ++中的数组&#34;衰变&#34;将指针传递给函数时,你需要做的就是删除&符号:
print(str);
如果删除
&
程序运行正常(即使打印功能需要字符引用)
那是对的!数组名称(在本例中为str
)被隐式转换为指针,该指针等于指向数组初始元素的指针。换句话说,它与写作相同
print(&str[0]);
答案 1 :(得分:1)
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
答案 2 :(得分:1)
只需将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 ++中的数组只是指向数组第一个元素的指针。
答案 3 :(得分:0)
函数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]
我建议使用更现代的编译器。:)