为什么将指针传递给采用指针的函数是错误的

Why is it wrong to pass a pointer to a function taking a pointer?

本文关键字:指针 错误 函数 为什么      更新时间:2023-10-16
#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] 的对象的指针

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