Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将数组传递到方法时,使用指针更改数组_C_Arrays_Pointers - Fatal编程技术网

C 将数组传递到方法时,使用指针更改数组

C 将数组传递到方法时,使用指针更改数组,c,arrays,pointers,C,Arrays,Pointers,假设我正在编写一个排序数组方法。当时我不知道指针,我通常将数组定义为全局数组,以便它自动更改。 现在我试着使用它,但失败了,基本上它以 int a[5]; sort(&a); // Calling sort ... // My method void sort(int *a[]) { int key = *a[1]; // I've got a bug right here ... } 我仍然不熟悉使用指针。此外,我也不能引用。请给我建议一些方法。 非常感谢。将

假设我正在编写一个排序数组方法。当时我不知道指针,我通常将数组定义为全局数组,以便它自动更改。 现在我试着使用它,但失败了,基本上它以

int a[5];
sort(&a);     // Calling sort
...
// My method
void sort(int *a[]) {
    int key = *a[1]; // I've got a bug right here
    ...
}
我仍然不熟悉使用指针。此外,我也不能引用。请给我建议一些方法。
非常感谢。

将函数更改为:
无效排序(int*a)
或此:
无效排序(int a[])


当您从main调用
sort
时,不需要调用
sort(&a)
a
本身就是一个数组指针,调用
sort(a)
就可以了

您对数组的传递和使用都不正确。数组名转换为指向其第一个元素的指针。因此,传递名称就足以修改它,而不是指向数组的指针(您也可以传递指向数组的指针——但必须在函数中相应地使用,并且通常不需要修改数组的元素)

叫它:

sort(a);
并使用它:

void sort(int a[]) {
    int key = a[1]; 
    ...
}
sort()
中,可以将其与常用的数组表示法一起使用


需要注意的一点是,您无法使用
sizeof
运算符在
sort()
中获取数组的大小,因为所有大小信息都在
sort()
中丢失,而您所拥有的只是一个指针。因此,您必须将数组大小作为一个附加参数传递。

使用方括号表示法和索引区分指针(简单地说,它给出的是变量而不是地址),因此不应该在那里有星号。以下是等效的(但仅适用于0!):

如果您实际上试图使用键中第二个元素(索引1)的值,则应使用:

int key = a[1];

此外,由于a是地址,&a对您没有用处,您应该只使用a调用sort函数。

请为该语言(可能是C或C++)添加一个标记,那么在sort(a)中,每当我想更改数组时,我只需要像*a[0]=5;这样做是否正确?在阅读了你的解释后,我不知怎的明白了你不需要使用*a[0],
a
是指针,没有必要去引用它两次!您对
a[0]
a[1]
所做的任何更改都会反映出来,但如果在排序函数中执行
a=new int[10]
,这不会反映在您的
main
中,谢谢您提醒我有关(…)的大小,我只是想知道在实现sort()之后数组是否会改变。或者你的意思是我需要一个指针数组,数组中有值的地址?我不明白你的问题。你能指出你所指的答案中的句子吗?因为在你的答案中,我没有看到任何关于指针的东西,所以我想你建议我在sort(…)中声明指针对不起,这个问题没有澄清。希望你能为我解释一下函数定义,你只有一个指针
void排序(int a[]){}
void排序(int*a){}
完全相同。虽然有一个数组符号[],但它只是一个指针。我确实尝试了你给我看的东西,然后它就工作了。然而,我更感到困惑,因为我无法解释为什么会这样。为什么有些人用像doSomething(int*a[])这样的东西来改变数组,而我们却可以像你一样做?如果void sort(inta[]){}和void sort(inta*a){}就像你说的,在一个函数中,假设我有sort(inta,intb,intc),我怎么知道传递指针需要哪个呢。或者它只是发生在只有一个parameter的时候,我想当我调用Sort(&a)时,我的参数*a[]将是地址,所以基本上我只是尝试在地址上进行交互以同时更改数组。我这样想对吗?*a[]确实与传球相匹配,但这会造成复杂的情况。当您试图以*a[1]的形式访问第二个元素时,就会出现问题。首先计算方括号,并将其索引到指针数组中(您尚未创建,也不希望创建指针数组)。*然后将其延迟,以获取该伪数组中的第一个元素。这可能超出了实际阵列的内存空间,并导致错误。如果您执行(*a)[1],它可能会起作用,但不要这样做。它不必要地复杂,读、写和调试都很困难。使用sort(a)、void sort(int a[])和int key=a[1]。非常感谢!!!通过你和其他人的评论以及在谷歌上的搜索,我发现数组与指针的工作方式基本相同,只是传递数组就已经是指针了。我以前不知道,所以我一直声明全局变量。JAVA也是如此
int key = a[1];