在C/C++中,数组是如何传递给函数的?

整个数组不能作为参数传递给C++中的函数。但是,可以通过指定数组的名称来传递指向不带索引的数组的指针。

null

在C语言中,当我们将数组传递给函数say fun()时,它总是被fun()视为指针。下面的示例演示了同样的情况。

C++

// CPP Program to demonstrate passing
// an array to a function is always treated
// as a pointer
#include <iostream>
using namespace std;
// 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]);
cout << "Array size inside fun() is " << n;
}
// Driver Code
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
unsigned int n = sizeof (arr) / sizeof (arr[0]);
cout << "Array size inside main() is " << n;
fun(arr);
return 0;
}


C

#include <stdio.h>
#include <stdlib.h>
// 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 ( "Array 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;
}


输出

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

因此,在C中,我们必须将数组的大小作为参数传递。仅在以“”结尾的字符数组中可能不需要大小,可以通过检查字符串的结尾来确定大小。

下面是一个简单的示例,展示了数组通常是如何在C中传递的:

图片[1]-在C/C++中,数组是如何传递给函数的?-yiteyi-C++库

C++

#include <iostream>
using namespace std;
void fun( int *arr, unsigned int n)
{
int i;
for (i = 0; i < n; i++)
cout << " " << arr[i];
}
// Driver program
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
unsigned int n = sizeof (arr)/ sizeof (arr[0]);
fun(arr, n);
return 0;
}


C

#include <stdio.h>
void fun( int *arr, unsigned int n)
{
int i;
for (i=0; i<n; i++)
printf ( "%d  " , arr[i]);
}
// Driver program
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
unsigned int n = sizeof (arr)/ sizeof (arr[0]);
fun(arr, n);
return 0;
}


输出

1  2  3  4  5  6  7  8

练习: 预测以下C程序的输出:

项目1:

C++

// Program 1
#include <iostream>
using namespace std;
void fun( int arr[], unsigned int n)
{
int i;
for (i = 0; i < n; i++)
cout << arr[i] << " " ;
}
// Driver program
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
unsigned int n = sizeof (arr) / sizeof (arr[0]);
fun(arr, n);
return 0;
}


C

#include <stdio.h>
void fun( int arr[], unsigned int n)
{
int i;
for (i=0; i<n; i++)
printf ( "%d " , arr[i]);
}
// Driver program
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
unsigned int n = sizeof (arr)/ sizeof (arr[0]);
fun(arr, n);
return 0;
}


输出

1 2 3 4 5 6 7 8

项目2:

C++

// Program 2
#include <iostream>
using namespace std;
void fun( int * arr)
{
int i;
unsigned int n = sizeof (arr) / sizeof (arr[0]);
for (i = 0; i < n; i++)
cout << " " << arr[i];
}
// Driver program
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
fun(arr);
return 0;
}


C

#include <stdio.h>
void fun( int *arr)
{
int i;
unsigned int n = sizeof (arr)/ sizeof (arr[0]);
for (i=0; i<n; i++)
printf ( "%d  " , arr[i]);
}
// Driver program
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
fun(arr);
return 0;
}


输出

 1 2

方案3:

C++

// Program 3
#include <iostream>
#include <string.h>
using namespace std;
void fun( char * arr)
{
int i;
unsigned int n = strlen (arr);
cout << "n = " << n << endl;
for (i = 0; i < n; i++)
cout << arr[i] << " " ;
}
// Driver program
int main()
{
char arr[] = "geeksquiz" ;
fun(arr);
return 0;
}


C

#include <stdio.h>
#include <string.h>
void fun( char *arr)
{
int i;
unsigned int n = strlen (arr);
printf ( "n = %d" , n);
for (i=0; i<n; i++)
printf ( "%c  " , arr[i]);
}
// Driver program
int main()
{
char arr[] = "geeksquiz" ;
fun(arr);
return 0;
}


输出

n = 9g e e k s q u i z 

方案4:

C++

// Program 4
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
void fun( char * arr)
{
int i;
unsigned int n = strlen (arr);
cout << "n = " << n << "" ;
for (i = 0; i < n; i++)
cout << " " << arr[i];
}
// Driver program
int main()
{
char arr[]
= { 'g' , 'e' , 'e' , 'k' , 's' , 'q' , 'u' , 'i' , 'z' };
fun(arr);
return 0;
}


C

#include <stdio.h>
#include <string.h>
void fun( char *arr)
{
int i;
unsigned int n = strlen (arr);
printf ( "n = %d" , n);
for (i=0; i<n; i++)
printf ( "%c  " , arr[i]);
}
// Driver program
int main()
{
char arr[] = { 'g' , 'e' , 'e' , 'k' , 's' , 'q' , 'u' , 'i' , 'z' };
fun(arr);
return 0;
}


输出

n = 11g e e k s q u i z

注: 上述程序中的字符数组未以“”结尾。(见 (详情请参阅)

这些是我们常用的一些方法,但是你知道有更好的方法可以做到这一点吗。为此,我们首先需要看看上述所有建议方法的缺点:

缺点:

  • 上述方法的一个主要缺点是编译器不知道要传递什么。我的意思是,对于编译器,我们只是传递一个int*,我们知道这是指向数组的,但编译器不知道这一点。
  • 要验证我的语句,可以调用数组中的每个循环。你肯定会得到一个错误,说找不到可调用的begin,end函数。 这是因为传递的数组实际上就像传递一个整数指针,它本身没有关于底层数组的信息,因此没有提供迭代器。

模板方法(参考数组):

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

此处模板用于模板参数推导。

C++

// CPP Program to demonstrate template approach
#include <iostream>
using namespace std;
template < size_t N> void print( int (&a)[N])
{
for ( int e : a) {
cout << e << endl;
}
}
// Driver Code
int main()
{
int a[]{ 1, 2, 3, 4, 5 };
print(a);
}


输出

12345

在这里你可以看到为什么我们需要模板参数推导。为一个基创建一个数组的引用,这样我们就可以把数组作为一个参数。

相关文章:

如果你发现任何不正确的地方,或者你想分享更多关于这里讨论的话题的信息,请写评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享