Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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_Function_Scope - Fatal编程技术网

C 数组在一个空函数中变了,外面还是变了!为什么?(范围)

C 数组在一个空函数中变了,外面还是变了!为什么?(范围),c,function,scope,C,Function,Scope,这是排序算法的一个简单实现。我的问题是。数组numbers,在main中声明并初始化。然后,我像传递函数sort中的参数一样传递它(是否为副本?)。在sort函数中,numbers,现在称为array(据我所知,是一个副本)被更改(排序)。那么,为什么在调用函数后,数组numbers会发生更改(这就是我想要的,buy想知道原因吗?。array范围在sort中,而不是main) int main(void) { int numbers[SIZE] = { 4, 15, 16, 50, 8,

这是排序算法的一个简单实现。我的问题是。数组
numbers
,在main中声明并初始化。然后,我像传递函数
sort
中的参数一样传递它(是否为副本?)。在
sort
函数中,
numbers
,现在称为
array
(据我所知,是一个副本)被更改(排序)。那么,为什么在调用函数后,数组
numbers
会发生更改(这就是我想要的,buy想知道原因吗?。
array
范围在
sort
中,而不是
main

int main(void)
{
    int numbers[SIZE] = { 4, 15, 16, 50, 8, 23, 42, 108 };
    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("\n");

    sort(numbers, SIZE);

    for (int i = 0; i < SIZE; i++)
        printf("%d ", numbers[i]);
    printf("\n");
    return 0;
}
void sort(int array[], int size)
{
    int swaps = 0;

    while(swaps==0)
    {
        for(int i = 0; i < size ; i++)
        {
            for(int j = i + 1; j < size ; j++)
            {
                if( array[i] > array[j] )
                {
                    // Swapping
                    int temp = array[i]; 
                    array[i] = array[j];
                    array[j] = temp;

                    swaps ++;
                }   
            }
        }
    }    
}
int main(无效)
{
整数[大小]={4,15,16,50,8,23,42,108};
对于(int i=0;i数组[j])
{
//交换
int temp=数组[i];
数组[i]=数组[j];
数组[j]=温度;
交换++;
}   
}
}
}    
}
无效排序(int-array[],int-size)
传递数组的引用,即传递指向该数组的指针(正如@pst正确指出的,这不是一个精确的术语,C总是按值传递)不是数组的副本。您所做的任何修改都将修改原始数组

如果不想修改原始数组,请复制它并传递副本

另一种(更有效的)方法是从调用方进行分配,并将指针传递给函数:

void sort(int *const array,int [] result, int size)
如果您的算法不需要“就地”工作,这将特别方便

请注意,在函数内部创建副本并将指向副本的指针作为返回值传递回在技术上是可行的,但实际上并不鼓励这样做

  • 不能在函数内分配int[]并返回它 因为它将超出范围
  • 你可以做一个malloc,但是你必须记住把它从 调用者函数,很容易忘记

int array[]
int*array
相同。您正在传递指针。

您通过引用传递了数组,因此对数组的任何操作都会影响内存中的该位置。

在C中,有两种不同的方法将参数传递给函数/方法。 -传递值 -传球手

传递值的优点是为函数提供一个可以修改的副本。缺点是(对于大型对象)由于需要复制数据,传递速度较慢

传递指针要比复制大对象快得多,因为值不会被复制。但是如果被调用函数修改了值,原始变量也会被更改。这有时是有意的(例如,在排序函数中或在返回多个值的函数中)


编辑:显然,我在这里弄混了一些东西,所以我试图解决这个问题……最初我说的是“通过引用调用”和“通过值调用”但C实际上不支持引用。请阅读注释以了解更多详细信息。

C中的数组是作为指向其第一个元素的指针实现的。如果您需要副本,则必须创建一个副本。这并不完全正确。在许多情况下,数组被转换为指向其第一个元素的指针,但数组和指针不是相同。但是在函数原型中,
int数组[]
实际上只是写入
int*数组的另一种方式。那么,在函数调用中传递数组时,您会被一个指向第一个元素的指针卡住。这称为数组衰减。此外,索引运算符实际上只是第一个元素的地址,偏移量乘以元素类型的填充大小。I希望这更清楚一些(OP)。哦,不,你不是。引用C++。(C++调用它)。C C只允许内存中对象的突变。C通过指针传递值。这个指针(在这里的数组后面掩饰)被用作间接查找来执行副作用。(请阅读维基百科的文章。)此外,C允许您将联合和结构作为即时值传递给函数。如果您想修改结构,您必须传递指向结构的指针,但如果您只想阅读它,您可以直接传递结构。感谢您的澄清。我混合了几年前在学校学到的一些内容。我希望您能更愉快地理解h这个版本…不,它不是“.通过引用”:(没有必要说“引用”)在回答中。如果您想让我删除my-1,请提供K&R、C规范或其他与C相关的值得注意的来源的参考,以证明这是正确和/或可接受的说法。抱歉,我们似乎不同意术语。通过“引用”传递指针是一个概念,指针是通过其地址对内存区域的引用。从技术上讲,即使您所做的是通过值传递指针,它仍然是一个引用。请看。它实际上不同。在某些语言中,特定语言的说法是“通过引用传递”(我认为这在Python中很常见),尽管“通过[对象]共享调用”在大多数情况下,除了使用实际的引用语义(例如,在VB中,代码< ByRef > <代码> > C++中的代码>和REF>代码>,在C语言中,代码< > REF/OUT 等等,在爪哇,可接受的术语是-AFAIK——“通过值传递引用”。…无论如何,我们应该注意语言,尽量避免歧义。:函数参数总是