void test(int* integers, int n) { ... }
void test(int* integers[], int n) { ... }
有什么区别?它们都是指向int的指针,可以用作数组。何时使用第一个,例如?
答案 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)
{
//...
}