C++ 将指针作为参数传递给函数的正确方法是什么?

C++ 将指针作为参数传递给函数的正确方法是什么?,c++,arrays,pointers,C++,Arrays,Pointers,假设我正在定义一个打印多维数组元素的函数 int print(int *a) { for (int i=0;i<4;i++) { for(int j=0;j<4;j++) { cout<< *((a+i*4)+j);} } } return 0;} 它显示错误,但在使用调用时提供正确的输出 int c=print((int*)a) 这三种方法的区别是什么?请先阅读:此处描述的方法可能会导致内存泄漏。如果不考虑内存对齐方式和大小,您可能永远不会强制转换指针 这是

假设我正在定义一个打印多维数组元素的函数

int print(int *a)
{
 for (int i=0;i<4;i++)
{ 
for(int j=0;j<4;j++)
{  
cout<< *((a+i*4)+j);}
}
}
return 0;}
它显示错误,但在使用调用时提供正确的输出

int c=print((int*)a)

这三种方法的区别是什么?

请先阅读:此处描述的方法可能会导致内存泄漏。如果不考虑内存对齐方式和大小,您可能永远不会强制转换指针

  • 这是一个糟糕的决定

    int c=print(int *a);
    
  • 这应该是正确的方法,您应该确保“a”是指向int的指针,否则可能会出现内存泄漏,请注意编译器警告

    int c=print(a);
    
    int c=print((int*)a);
    
  • 在这种情况下,如果您对a进行显式转换,强制它成为指向int的指针,那么无论您真正拥有什么,都可能导致内存泄漏,请注意编译器警告

    int c=print(a);
    
    int c=print((int*)a);
    
  • 注意

    如果您对这个概念不是很清楚,那么在C/C++中使用指针是非常危险的。如果不强制转换指针,此阶段中的任何错误都可能导致致命的内存泄漏。内存泄漏是一种内存禁用,由类似这样的情况引起,当指针未处于正确的强制转换中时,它可能会使程序或其任何部分崩溃

    关于你的头衔:

    如果你问的是“int*”和“(int*)”之间的区别,你的问题的格式不正确。它可能是:


    “将指针作为参数传递给函数的正确方法是什么?”>/P>我假设这是C++——为什么不使用<代码> STD::数组< /代码>?为什么<代码>打印< /C>不返回一个值?假设您定义了一个函数返回代码> int <代码>,然后在该函数的实现中不能包含<代码>返回< /代码>语句。您认为使用未从中返回值的函数的返回值会是什么?您希望该功能如何正常工作?关于编写代码,最重要的是要了解如何实际阅读您正在编写的代码,并了解它做什么(和不做什么)。我知道它应该返回一个整数,但这不是我所面临的错误!您面临的错误是,您发布的代码毫无意义,并要求我们解释为什么它不起作用。发布你真正的代码,而不是为了你的问题而编造的东西,并问一个关于代码的具体问题。为什么第一个是一个糟糕的电话?它还告诉我们“a”是指向int的指针。我们在定义函数的参数时使用它,而all.case1是一个错误的调用,因为您编写的代码应该在定义函数时执行。这是一个错误。你应该按照案例2或案例3进行。在案例3中:这称为“cast”,它是从一个指针到另一个指针的显式转换。@HunarJain:这只是一个语法错误,没有任何意义。在定义函数的参数时使用它这一事实是不相关的,这并不意味着在完全不同的上下文中使用它是可以的
    intc=print(嗨,编译器!这是指向int-->a的指针)
    还“告诉
    a
    是指向int的指针”,但这也是一个语法错误。@christian:你的答案前后都有(2)和(3)。例如,如果
    a
    是指向
    char
    的指针,那么使用cast-in(3)是一个“非常危险”的选项,因为您迫使编译器接受一些可能毫无意义的内容。(2) 当类型不匹配时将无法编译,这是您想要的,所以这是最好的选择。此外,“内存泄漏”的意思与您描述的完全不同。@PaulGriffiths是的,将一个字节转换为整数是非常危险的。在这个答案中不是这样的。我试图用正确的方式来解释,而不是C语言糟糕用法的连续性。