void test(int* integers, int n) { ... }
void test(int* integers[], int n) { ... }
有什么区别?它们都是指向 int 的指针,可以用作数组。例如,何时使用第一个?
void test(int* integers, int n) { ... }
void test(int* integers[], int n) { ... }
有什么区别?它们都是指向 int 的指针,可以用作数组。例如,何时使用第一个?
int*
是指向 的指针int
。它不是数组,但它可能表示数组的起始地址(或数组迭代器——数组内部的位置)。
int*[]
是一个指针数组(不是s数组!)int
。因为我们在函数参数的上下文中,所以可以有空括号(即未知大小的数组),这有效地使这个参数成为指向指针的指针。int
int
您的意思是“void test(int* integers)
和之间有什么区别void test(int integers[])
”吗?
作为函数参数,和对编译器来说是相同的type arg[]
,并且实际上意味着。type arg[SIZE]
type* arg
type* arg
对于阅读您的代码的程序员:
type arg[]
给出一个提示,它arg
应该是一个表示数组起始地址的指针。
type arg[SIZE]
给出一个提示,它arg
应该是一个指针,它表示指定数组的起始地址SIZE
。请注意,编译器会忽略SIZE
并且不执行任何边界检查。
在变量的声明中,区别如下:
int* integers;
这是一个类型变量的声明int*
,它是一个指向整数的指针。
int* integers[x];
这是一个指向的 x指针数组的声明。int
但是,在声明函数参数的上下文中,数组语法只是声明指针的语法糖,提示阅读代码的人该指针将用作数组。
因此:
void test(int* integers[], int n) { ... }
在这个声明中,test
接受一个指向. int
如果在方括号 ([]) 内放入了任何大小,编译器将完全忽略它,并且integers
仍将其视为普通的int**
.
换句话说,这相当于:
void test(int** integers, int n) { ... }
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
*
表示点->值,而
**
表示点->地址->值。另请注意,(在堆栈中)它仅指向基地址,即连续内存位置的第一个索引
为了理解差异,我将解释这一点:
当您将 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)
{
//...
}