为什么将指针传递给带指针的函数是错误的?

时间:2015-07-13 18:45:51

标签: c++ pointers

#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 *)

中参数'str'中键入不匹配

由于函数print的参数列表由一个指针组成,因此在函数调用中传递&amp; str 应该是正确的
如果我删除'&amp;'程序运行正常(即使打印功能需要字符引用)。

4 个答案:

答案 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 ++中的数组只是指向数组第一个元素的指针。

http://www.cplusplus.com/forum/articles/9/

答案 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]

类型的对象的指针

我建议使用更现代的编译器。:)