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];