[英]Swap function for Array
我们拥有的信息:
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
是指向int
的指针,编译器会将地址计算为a+sizeof(int)*42
。 这个特定的示例在生成的程序集源中显示为addl $168, %eax
。
A)C和C ++是两种不同的语言。 给定您的swap(int &c, int &b)
方法定义,它就是C ++
B)因为它是C ++,并且您正在传递引用 ,所以您获得了对数组元素的引用(在内存中位于a + i
)
如果是C,则将您的函数定义为swap(int *c, int *d)
并且将传递指针a + i
因为数组会自动降级为指针。
首先,交换函数是个坏主意,因为总和的值可能会溢出。 只需使用一个临时变量。
当调用swap(a [i],a [j])时,函数的参数是指向存储位置a [i]和a [j]的两个指针。 指针包含两个int的地址。 函数swap()不会将两个int放在同一数组中。
将c和d声明为引用类似于传递指针,但是,您只能使用存储在此内存位置中的值(等效于取消引用指针),而不能更改指针指向的地址。
- 定义数组
a[1000]
,a
是指针地址。
不,不是。 a
是一个数组。 在许多情况下,它会衰减到指向第一个元素的指针,但它不是指针的地址(当然,除非您创建了一个指针数组)。
仅当数字之和在值范围内时才可以交换两个不带temp的数字,这种想法很好用;一个int可以保存。(通常为power(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是基地址。类似地,当您通过值的引用地址时,也会被传递。
注意:引用是隐式常量,引用必须在声明时赋予值。
引用的行为就像隐式取消引用的const指针一样,传递引用比使用指针安全,因为使用指针可能会导致段错误(没有动态分配内存的地方)
a[i]
代表值,所以&a[i]
= a + i
将被(内部)传递。 同样对于a[j]
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.