C++中数组作为函数参数传递,和使用指针作为函数参数有什么区别? ...

打印 上一主题 下一主题

主题 965|帖子 965|积分 2895

在C++里,数组作为函数参数传递和使用指针作为函数参数在很多方面体现出相似性,但也存在一些明显区别,下面从多个维度睁开具体分析。
1. 语法形式



  • 数组作为函数参数:在函数定义时,数组参数一般以如下形式出现:
  1. void function(int arr[], int size);
复制代码
这里的arr看似是数组,不过实际上它会被编译器当作指针来处置处罚。size用于明白数组的元素数目,因为函数内部无法直接获取数组的巨细。


  • 指针作为函数参数:函数定义时指针参数的形式为:
  1. void function(int* ptr, int size);
复制代码
ptr是一个指向int范例的指针,size同样是用来指明所指向数组的元素数目。
2. 本质



  • 数组作为函数参数:当把数组名作为参数传递给函数时,数组名会隐式转换为指向数组首元素的指针。也就是说,函数接收的是数组首元素的地址,而非整个数组的副本。
  1. #include <iostream>
  2. void modifyArray(int arr[], int size) {
  3.     for (int i = 0; i < size; ++i) {
  4.         arr[i] *= 2;
  5.     }
  6. }
  7. int main() {
  8.     int myArray[3] = {1, 2, 3};
  9.     modifyArray(myArray, 3);
  10.     for (int i = 0; i < 3; ++i) {
  11.         std::cout << myArray[i] << " ";
  12.     }
  13.     return 0;
  14. }
复制代码
在上述代码中,modifyArray函数对arr的操作会直接影响到main函数里的myArray,这表明传递的是数组首元素的地址。


  • 指针作为函数参数:传递的就是一个指针变量,该指针指向某个内存地址,可能是数组的首地址,也可能是其他变量的地址。
  1. #include <iostream>
  2. void modifyValue(int* ptr) {
  3.     *ptr = 10;
  4. }
  5. int main() {
  6.     int num = 5;
  7.     modifyValue(&num);
  8.     std::cout << num << std::endl;
  9.     return 0;
  10. }
复制代码
此代码中,modifyValue函数接收一个指向int范例的指针,通过解引用操作修改了指针所指向变量的值。
3. 数组巨细信息



  • 数组作为函数参数:函数内部无法直接获取数组的巨细。这是因为数组名在传递过程中退化为指针,丢失了数组巨细的信息。以是,通常必要额外传递一个表现数组巨细的参数。
  1. #include <iostream>
  2. void printArray(int arr[], int size) {
  3.     for (int i = 0; i < size; ++i) {
  4.         std::cout << arr[i] << " ";
  5.     }
  6.     std::cout << std::endl;
  7. }
  8. int main() {
  9.     int myArray[3] = {1, 2, 3};
  10.     printArray(myArray, 3);
  11.     return 0;
  12. }
复制代码


  • 指针作为函数参数:同样,函数内部不能直接从指针获取所指向数组的巨细,也必要额外传递数组巨细的信息。
  1. #include <iostream>
  2. void printArray(int* ptr, int size) {
  3.     for (int i = 0; i < size; ++i) {
  4.         std::cout << ptr[i] << " ";
  5.     }
  6.     std::cout << std::endl;
  7. }
  8. int main() {
  9.     int myArray[3] = {1, 2, 3};
  10.     printArray(myArray, 3);
  11.     return 0;
  12. }
复制代码
4. 多维数组处置处罚



  • 数组作为函数参数:对于多维数组,除了第一维的巨细可以省略,其他维度的巨细必须明白指定。
  1. #include <iostream>
  2. void print2DArray(int arr[][3], int rows) {
  3.     for (int i = 0; i < rows; ++i) {
  4.         for (int j = 0; j < 3; ++j) {
  5.             std::cout << arr[i][j] << " ";
  6.         }
  7.         std::cout << std::endl;
  8.     }
  9. }
  10. int main() {
  11.     int my2DArray[2][3] = {{1, 2, 3}, {4, 5, 6}};
  12.     print2DArray(my2DArray, 2);
  13.     return 0;
  14. }
复制代码


  • 指针作为函数参数:处置处罚多维数组时,指针的使用会更复杂,必要使用多级指针大概指针数组。
  1. #include <iostream>
  2. void print2DArray(int** ptr, int rows, int cols) {
  3.     for (int i = 0; i < rows; ++i) {
  4.         for (int j = 0; j < cols; ++j) {
  5.             std::cout << ptr[i][j] << " ";
  6.         }
  7.         std::cout << std::endl;
  8.     }
  9. }
  10. int main() {
  11.     int** my2DArray = new int*[2];
  12.     for (int i = 0; i < 2; ++i) {
  13.         my2DArray[i] = new int[3];
  14.         for (int j = 0; j < 3; ++j) {
  15.             my2DArray[i][j] = i * 3 + j + 1;
  16.         }
  17.     }
  18.     print2DArray(my2DArray, 2, 3);
  19.     for (int i = 0; i < 2; ++i) {
  20.         delete[] my2DArray[i];
  21.     }
  22.     delete[] my2DArray;
  23.     return 0;
  24. }
复制代码
5. 可读性和语义



  • 数组作为函数参数:使用数组作为函数参数,在语义上更能体现函数是对数组进行操作,代码的可读性较好,尤其是在处置处罚数组相干的任务时,能让代码更直观。
  • 指针作为函数参数:指针的使用更加机动,但也更抽象。在一些情况下,使用指针作为参数可能会让代码的可读性降低,特殊是对于不熟悉指针操作的开辟者来说。
综上所述,数组作为函数参数传递和使用指针作为函数参数本质上很相似,不过在语法形式、多维数组处置处罚以及代码可读性等方面存在一些差别。在实际编程中,必要根据具体的需求和场景来选择合适的方式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表