将函数交换为数组

Swap function for Array

本文关键字:数组 交换 函数      更新时间:2023-10-16

我们拥有的信息:

1( 定义数组a[1000]a为指针地址。

2(

void swap(int &c, int &b)
{
    c=c+b;
    b=c-b;
    c=c-b;
} 
// this is a method of swapping two variables without using temp variable.
// We use call by reference for the swap to actually take place in memory.

现在,当我为a的两个条目调用这个函数时,比如a[i],a[j]。。。会发生什么??函数是由于C/C++的某些内部构造而接收到数组的两个单元的地址,还是接收到指向a[i]a[j]的指针的地址?

a[i]的计算结果为对第i个元素的引用。它相当于*(a+i),其中a+i是指向第i个元素的指针。

引用在内部的工作方式是由实现定义的(您不应该在意(,但大多数(所有(编译器在内部使用指针。在这种情况下,它们将是指向数组中两个元素的指针。

我想说,在场景背后,它将接收到指向a[i]a[j]的指针。

在以下两个程序上运行g++ -S会产生相同的结果:

#include<iostream>
extern "C" void swap(int&c,int&b){
    c=c+b;
    b=c-b;
    c=c-b;
}
int main(){
    int*a=new int[1000];
    a[10]=10;
    a[42]=42;
    swap(a[10],a[42]);
    std::cout << a[10] << " " << a[42] << std::endl;
    delete[] a;
    return 0;
}

#include<iostream>
extern "C" void swap(int*c,int*b){
    *c=*c+*b;
    *b=*c-*b;
    *c=*c-*b;
}
int main(){
    int*a=new int[1000];
    a[10]=10;
    a[42]=42;
    swap(a+10,a+42);
    std::cout << a[10] << " " << a[42] << std::endl;
    delete[] a;
    return 0;
}

其中我使用extern "C"可以diff输出,否则损坏不同。

注意,当您编写例如a+42时,编译器会将地址计算为a+sizeof(int)*42,同时考虑到a是指向int的指针。此特定示例在生成的程序集中显示为addl $168, %eax

C和C++是两种不同的语言。给定您的swap(int &c, int &b)方法定义,它是C++

B( 因为它是C++,并且您正在传递引用,所以您将获得对数组元素的引用(在内存中位于a + i(

如果这是C,那么您将把函数定义为swap(int *c, int *d),并且您将传递指针a + i,因为数组会自动降级到指针。

  1. 定义数组a[1000]a为指针地址

不,不是。CCD_ 27是一个数组。在许多情况下,它衰减到指向第一个元素的指针,但它不是指针的地址(当然,除非您创建了指针数组(。

首先,交换函数是个坏主意,因为和的值可能会溢出。只需使用一个临时变量。

当您调用swap(a[i],a[j](时,函数的参数是指向内存位置a[i]和a[j].的两个指针。指针包含两个int的地址。函数swap((没有两个int在同一数组中的概念。

将c和d声明为引用类似于传递指针,但是,您只能使用存储在该内存位置中的值(相当于取消引用指针(,而不能更改指针指向的地址。

只有当数字之和在值的范围内时,在没有temp的情况下交换两个数字的想法才有效;int可以容纳。(通常为幂(2,sizeof(int((。否则将发生溢出。说到这个问题,

int *a=new int;
a[1000];// if i have understood your question then....

正如您在这里提到的,A是一个指针,A[i]是以A为基地址形成的数组。在c中,当你在内部说p[i]时,它被转换为*(p+i(,其中p是基地址。类似地,当你通过值的引用地址时,它也被传递。

注意:引用是隐式常量,必须在声明时为引用赋予值。

引用的作用就像一个隐式反引用的常量指针。传递引用比传递指针更安全,因为使用指针可能会导致分段错误。(其中没有内存的动态分配(

a[i]表示值,因此&a[i]=a + i将被传递(内部(。CCD_ 31也是如此。