📜  如何将数组传递给C / C++中的函数

📅  最后修改于: 2021-05-30 03:19:32             🧑  作者: Mango

在C语言中,当我们将数组传递给函数fun()时,fun()始终将其视为指针。下面的示例演示了相同的内容。

C
#include 
 
// Note that arr[] for fun is just a pointer even if square
// brackets are used
void fun(int arr[])  // SAME AS void fun(int *arr)
{
   unsigned int n = sizeof(arr)/sizeof(arr[0]);
   printf("\nArray size inside fun() is %d", n);
}
 
// Driver program
int main()
{
   int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
   unsigned int n = sizeof(arr)/sizeof(arr[0]);
   printf("Array size inside main() is %d", n);
   fun(arr);
   return 0;
}


C
#include 
 
void fun(int *arr, unsigned int n)
{
   int i;
   for (i=0; i


C
#include 
void fun(int arr[], unsigned int n)
{
int i;
for (i=0; i


C
#include 
void fun(int *arr)
{
   int i;
   unsigned int n = sizeof(arr)/sizeof(arr[0]);
   for (i=0; i


C
#include 
#include 
 
void fun(char *arr)
{
   int i;
   unsigned int n = strlen(arr);
   printf("n = %d\n", n);
   for (i=0; i


C
#include 
#include 
 
void fun(char *arr)
{
   int i;
   unsigned int n = strlen(arr);
   printf("n = %d\n", n);
   for (i=0; i


C++
#include 
using namespace std;
 
template
void print(int (&a)[N]){
    for(int e: a){
        cout << e << endl;
    }
}
 
int main(){
    int a[] {1, 2, 3, 4, 5};
    print(a);
}


输出:

Array size inside main() is 8
Array size inside fun() is 1

因此,在C语言中,我们必须将array的大小作为参数传递。仅在以’\ 0’结尾的字符数组的情况下,可能不需要大小,可以通过检查字符串字符的末尾来确定大小。
以下是一个简单的示例,以显示通常如何在C中传递数组。

C

#include 
 
void fun(int *arr, unsigned int n)
{
   int i;
   for (i=0; i

输出:

1  2  3  4  5  6  7  8

锻炼:
预测以下C程序的输出

1。

C

#include 
void fun(int arr[], unsigned int n)
{
int i;
for (i=0; i

2。

C

#include 
void fun(int *arr)
{
   int i;
   unsigned int n = sizeof(arr)/sizeof(arr[0]);
   for (i=0; i

3。

C

#include 
#include 
 
void fun(char *arr)
{
   int i;
   unsigned int n = strlen(arr);
   printf("n = %d\n", n);
   for (i=0; i

4,

C

#include 
#include 
 
void fun(char *arr)
{
   int i;
   unsigned int n = strlen(arr);
   printf("n = %d\n", n);
   for (i=0; i

请注意,上述程序中的字符数组未以’\ 0’结尾。有关详细信息,请参见此。

现在,这些是我们使用的一些常见方法,但是您知道吗,有一种超酷的方法可以做到这一点,因此您将能够保留阵列的身份。我们稍后将简要讨论。

为此,我们首先需要查看所有上述建议方法的缺点-

缺点:

  • 上述方法的主要缺点是编译器不知道要传递的内容。我的意思是,对于编译器,我们只是传递一个int *,并且我们知道这指向数组,但是编译器并不知道这一点。
  • 要验证我的声明,您可以在数组上调用for-each循环。您肯定会收到一条错误消息,指出未找到可调用的开始,结束函数。
    这是因为传递数组就像实际传递整数指针一样,它本身没有有关基础数组的信息,因此不提供迭代器。

模板方法(引用数组):

此方法保留有关基础数组的所有信息。
该方法主要基于对数组的引用,但是将其与模板一起使用可以优化我们的方法。模板依赖关系实际上是在函数调用时自动计算数组的长度,因此可以使用它来创建引用,因为对数组的引用必须知道数组的大小。

检查我的帖子有关对数组的引用

这里,模板用于推导模板参数。

C++

#include 
using namespace std;
 
template
void print(int (&a)[N]){
    for(int e: a){
        cout << e << endl;
    }
}
 
int main(){
    int a[] {1, 2, 3, 4, 5};
    print(a);
}
输出
1
2
3
4
5

在这里,您可以看到为什么需要模板参数推导–为base创建对数组的引用,以便我们可以将数组作为参数。

访问我上面的链接以了解以下信息:

  • 双重编译器对数组的看法。
  • 引用数组。
  • 如何使用参考?
  • 数组是类型还是仅指向第一个元素的指针?
  • 对于编译器而言,两个不同长度的数组是否相同?
  • 数组和指针之间的区别。

mohdatishanx改进的文章

相关文章:

  • 不要将sizeof用于数组参数。
  • C语言中的指针和数组之间的区别?
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”