整个数组不能作为参数传递给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中传递的:
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