通过指针传递数组

时间:2011-05-12 18:14:24

标签: c++ arrays

如何在void Func(int (*a)[5])中获取循环条件和打印元素的数组大小?

void Func(int (*a)[5])
{
   for (int i = 0; i < 5; i++)
      cout << a[i]; // doesn't work
}

int main()
{
   int a[] = {1, 2, 3, 4, 5};
   Func(&a);
}

7 个答案:

答案 0 :(得分:3)

如果主要强调传递数组的大小,那么使用函数模板会更好。

template <typename T, size_t N>
void Func(T (&a)[N])
{  
    for (int i = 0; i < N; i++)
      cout << a[i]; 
}

答案 1 :(得分:3)

首先,您访问阵列的方式是错误的。在函数内部,你有一个指针到一个数组。在您使用[]运算符

之前,必须首先取消引用指针
void Func(int (*a)[5])
{
   for (int i = 0; i < 5; i++)
      cout << (*a)[i];
}

其次,我不明白为什么你需要“获得”数组的大小,当大小在编译时固定,即它总是为5.但无论如何你可以使用众所周知的{ {1}}技巧

sizeof

在这种情况下,void Func(int (*a)[5]) { for (int i = 0; i < sizeof *a / sizeof **a; i++) cout << (*a)[i]; } 表达式保证评估为5。

答案 2 :(得分:1)

它不起作用,因为你没有足够的去引用它。你有一个指向数组的指针 - 指针需要取消引用,数组需要索引。

void Func(int (*a)[5])
{
   for (int i = 0; i < 5; i++)
      std::cout << (*a)[i];
}

int main()
{
   int a[] = {1, 2, 3, 4, 5};
   Func(&a);
}

答案 3 :(得分:0)

将数组传递给函数时,它会降级为指针并且所有大小的信息都会丢失。

答案 4 :(得分:0)

您可以使用STL容器(如vector)来简化操作。

#include <iostream>
#include <vector>
using namespace std;

void Func(vector <int> a){
   for (int i = 0; i < a.size(); i++)
   cout << a[i];
}

int main (){
       int nums[] = {1, 2, 3, 4, 5};
       vector<int> a (nums, nums + sizeof(nums) / sizeof(int) );
       Func(a);
}

答案 5 :(得分:0)

  

我如何获得数组的大小

你已经知道编译时的大小,它是5.你只是忘了取消引用指针:

cout << (*a)[i];

答案 6 :(得分:-1)

void Func(int * a)
{
   for (int i = 0; i < 5; i++)
      cout << *(a+i);
}

int main()
{
   int a[] = {1, 2, 3, 4, 5};
   Func(a);
}