int *和int * []之间有什么区别

时间:2013-07-08 08:15:51

标签: c++

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

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

4 个答案:

答案 0 :(得分:2)

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

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


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

作为函数参数type arg[]type arg[SIZE]type* arg与编译器的相同,实际上是{{1 }}。

对于读取代码的程序员:

  • type* arg提供提示type arg[]应该是一个表示数组起始地址的指针。

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

答案 1 :(得分: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) { ... }

答案 2 :(得分:-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

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

答案 3 :(得分:-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 *之间实际上没有区别。

如果你传递的是2维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)
{
   //...
}