将函数交换为数组
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+sizeof(int)*42
,同时考虑到a
是指向int
的指针。此特定示例在生成的程序集中显示为addl $168, %eax
。
swap(int &c, int &b)
方法定义,它是C++
B( 因为它是C++,并且您正在传递引用,所以您将获得对数组元素的引用(在内存中位于a + i
(
如果这是C,那么您将把函数定义为swap(int *c, int *d)
,并且您将传递指针a + i
,因为数组会自动降级到指针。
- 定义数组
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也是如此。
- 通过交换元素使数组相同
- 如何在数组中交换最小和最大的位置?
- 交换函数不是在 C++ 中交换 2D 数组的元素
- 如何交换数组中的元素?
- C++:交换矩阵的行:使用单维数组
- 使用指针 c++ 交换结构数组中的元素
- 使用指针交换数组的内容
- C++数组交换并查找最小元素
- 使用指针交换而不引用数组C++
- 指针数组交换无需直接访问数组
- 交换数组
- 如何在C++中交换对象数组的 2 个不同对象
- 如何将元素的索引从2D数组存储到1D数组中,然后交换这些值
- 在C++中使用 2D 数组进行交换
- 代码是否交换数组的两个数字
- std::在 std::shared_ptr 之间交换,<A>其中 A 具有动态数组
- 在2D数组中交换行的最佳方法
- 如何在 2D 数组 c++ 中交换元素
- 交换二维数组中的两个值
- 如何使用数组交换对象,c++.我想改变