2
void test(int* integers, int n) { ... }
void test(int* integers[], int n) { ... }

有什么区别?它们都是指向 int 的指针,可以用作数组。例如,何时使用第一个?

4

4 回答 4

4

int*是指向 的指针int。它不是数组,但它可能表示数组的起始地址(或数组迭代器——数组内部的位置)。

int*[]是一个指针数组不是s数组!)int。因为我们在函数参数的上下文中,所以可以有空括号(即未知大小的数组),这有效地使这个参数成为指向指针的指针intint


您的意思是“void test(int* integers)和之间有什么区别void test(int integers[])”吗?

作为函数参数,和对编译器来说是相同的type arg[],并且实际上意味着。type arg[SIZE]type* argtype* arg

对于阅读您的代码的程序员:

  • type arg[]给出一个提示,它arg应该是一个表示数组起始地址的指针。

  • type arg[SIZE]给出一个提示,它arg应该是一个指针,它表示指定数组的起始地址SIZE。请注意,编译器会忽略SIZE并且不执行任何边界检查。

于 2013-07-08T08:20:18.437 回答
2

在变量的声明中,区别如下:

int* integers;

这是一个类型变量的声明int*,它是一个指向整数的指针。

int* integers[x];

这是一个指向的 x指针数组的声明。int

但是,在声明函数参数的上下文中,数组语法只是声明指针的语法糖,提示阅读代码的人该指针将用作数组。

因此:

void test(int* integers[], int n) { ... }

在这个声明中,test接受一个指向. int如果在方括号 ([]) 内放入了任何大小,编译器将完全忽略它,并且integers仍将其视为普通的int**.

换句话说,这相当于:

void test(int** integers, int n) { ... }
于 2013-07-08T08:27:20.703 回答
-2
void test1(int* integers, int n) { ... }
void test2(int* integers[], int n) { ... }

您可以将参数传递给它们,例如:

int arr[10];
void test1(arr, 10) { ... }

int arr2D[5][5];
void test2(arr2D, 10) { ... }

int *integers[]在函数参数中将衰减为int **integers

*表示点->值,而 **表示点->地址->值。另请注意,(在堆栈中)它仅指向基地址,即连续内存位置的第一个索引

于 2013-07-08T08:27:36.187 回答
-2

为了理解差异,我将解释这一点:

当您将 int 数组发送到函数时,您可以这样做:

int arr[5]={7,6,4,7,8}
myFunction(arr,5)

函数原型将如下所示:

void myFunction(int* arr, int size)
{
   //...
}

或者

void myFunction(int[] arr, int size)
{
  //...
}

实际上,函数原型中的 int[] 或 int* 之间没有区别。

如果你传递一个二维 int 数组,你可以这样做:

int rows=3, cols=4;
int arr[rows][cols];
//... fill your array
myFunction2(arr,rows,cols);

函数原型将是:

void myFunction2(int[] arr[cols],int rows, int cols)
{
   //...
}

或者

void myFunction2(int* arr[cols], int rows, int cols)
{
   //...
}
于 2013-07-08T08:35:34.813 回答