我对此有点困惑。我的教授告诉我,当你想要某些东西改变时,你会传递一个指针。我用swap(&first_number, &second_number)
的例子来理解它。也,
我知道我不需要一个返回最多两个整数的函数的指针,因为我可以发送两个整数的副本,函数可以很容易地返回最大值。
但我对此感到困惑:
void f(int a[], int *n)
{
a[3] = a[(*n)-1];
(*n)--;
}
这很有效。如何才能100%确定何时通过int *a[]
或int a[]
?
答案 0 :(得分:1)
当用作函数的形式参数时,int a[]
和int *a
是等效的。
这是一个例子 - 在gcc 4.8
上干净地编译void foo(int *a) {
}
void bar(int a[]) {
}
int main(int argc, char *argv[]){
int value;
int array[2] = {1,2};
foo(&value);
foo(array);
bar(&value);
bar(array);
}
答案 1 :(得分:0)
我的教授告诉我,当你想要改变什么时,你会传递一个指针。
这意味着如果要在调用函数中声明的变量中看到更改,则需要将指向该变量的指针传递给被调用函数,前提是被调用函数需要将变量指针作为参数。
当数组名作为参数传递给函数时,数组名转换为指向其第一个元素的指针。如果用作函数参数int a[]
和int *a
是等效的。
void f(int a[], int *n)
相当于
void f(int *a, int *n)
因此,您不需要int *a[]
。
答案 2 :(得分:0)
int * a[] - means array of pointers
- so each index will store pointer type variable
例如:
int *arr[2];
int a=10,b=20;
int *ptr1=&a;
int *ptr2=&b;
arr[0]=ptr1;
arr[1]=ptr2;
printf("%d",*arr[0]);--->10
printf("%d",*arr[1]);--->20
其中
int a[]- array of integers
also can be said as pointer to an array
例如:
int arr[]={10,20};
printf("%d",*arr)--->10
所以当你想把数组传递给函数时,使用int * var 或int var [] 当你想传递具有指针变量作为元素的数组时,请使用int * var []
答案 3 :(得分:0)
在函数调用中传递参数的方法有两种:
最后一个自动用于非基本类型(例如数组),因此不需要'';值在内存中,您提供对此内存块的引用。
因此int a[]
将指向内存中的数组。按值传递意味着您传递的变量的值将复制到方法中的局部变量。更改该局部变量对源变量没有影响。如果通过引用传递它(int n),则可以更改源变量。
传递int* a[]
将是对int的指针数组的引用,在你的情况下你不需要它。
但是,您可以使用int* a
代替int a[]
来指向数组的第一个元素。
答案 4 :(得分:0)
在不知道数组长度的情况下直接使用[3]会很危险,如果数组小于4 int,则会产生分段错误。避免这种行为的最佳方法是,在函数的参数中传递数组的长度。