一、指针与强制类型转换
指针类型的强制转换,是指将指针所指的内容的类型由原先的类型转换为后面的类型
int a = 1;
int *p = &a;
float *p1 = (float*)p;
p和p1的值都是&a,但是p是将&a地址中的值按照int型变量进行解释,而p1则是将&a地址中的值按照float型变量进行解释
二、引用
#include <iostream>
using namespace std;
int main() {
int a = 99;
int &r = a;
cout << a << ", " << r << endl;
cout << &a << ", " << &r << endl;
return 0;
}
打印出的前一行是两个99,第二行是两个地址的值。注意,引用在定义时需要添加&,在使用时不能添加&
,使用时添加&表示取地址。由于引用和原始变量都对应同一份内存,所以对其中一个赋值可以改变该变量及其所有引用的值。如果读者不希望通过引用来修改原始的数据,那么可以在定义时添加 const 限制,即为常引用。
在定义或声明函数时
,我们可以将函数的形参指定为引用
的形式,这样在调用函数时就会将实参和形参绑定在一起
,让它们都指代同一份数据
。如此一来,如果在函数体中修改了形参的数据,那么实参的数据也会被修改,从而拥有“在函数内部影响函数外部数据”的效果。
#include <iostream>
using namespace std;
//直接传递参数内容
void swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
}
//传递指针
void swap2(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//按引用传参
void swap3(int &r1, int &r2) {
int temp = r1;
r1 = r2;
r2 = temp;
}
int main() {
int num1, num2;
cout << "Input two integers: ";
cin >> num1 >> num2;
swap1(num1, num2);
cout << num1 << " " << num2 << endl;
cout << "Input two integers: ";
cin >> num1 >> num2;
swap2(&num1, &num2);
cout << num1 << " " << num2 << endl;
cout << "Input two integers: ";
cin >> num1 >> num2;
swap3(num1, num2);
cout << num1 << " " << num2 << endl;
return 0;
}
- swap1() 直接传递参数的内容,不能达到交换两个数的值的目的。对于 swap1() 来说,a、b 是形参,是作用范围仅限于函数内部的局部变量,它们有自己独立的内存,和 num1、num2 指代的数据不一样。调用函数时分别将 num1、num2 的值传递给 a、b,此后 num1、num2 和 a、b 再无任何关系,在 swap1() 内部修改 a、b 的值不会影响函数外部的 num1、num2,更不会改变 num1、num2 的值。
- swap2() 传递的是指针,能够达到交换两个数的值的目的。调用函数时,分别将 num1、num2 的指针传递给 p1、p2,此后 p1、p2 指向 a、b 所代表的数据,在函数内部可以通过指针间接地修改 a、b 的值。
- swap3() 是按引用传递,能够达到交换两个数的值的目的。调用函数时,分别将 r1、r2 绑定到 num1、num2 所指代的数据,此后 r1 和 num1、r2 和 num2 就都代表同一份数据了,通过 r1 修改数据后会影响 num1,通过 r2 修改数据后也会影响 num2。
由于引用可以改变实参的值,它可以作为函数返回值
,毕竟C++只能return一个变量,多变量的时候可以采用这个办法。但是在将引用作为函数返回值时应该注意一个小问题,就是不能返回局部数据
(例如局部变量、局部对象、局部数组等)的引用,因为当函数调用完成后局部数据就会被销毁,有可能在下次使用时数据就不存在了,C++ 编译器检测到该行为时也会给出警告。
三、引用和指针的区别
#include <iostream>
int main(int argc, char const *argv[])
{
int a = 5;
int *p = &a;
int &r = a;
std::cout<<a<<std::endl;
std::cout<<p<<std::endl;
std::cout<<&r<<std::endl;
return 0;
}
//输出:
5
0x7fffffffdca4
0x7fffffffdca4
四、指针和引用转换
-
指针转引用:把指针用
*
就可以转换成对象,可以用在引用参数当中。 -
引用转指针:把引用类型的对象用
&
取地址就获得指针了
指针转引用
// 1、函数声明为引用类型
int Discover(std::vector<tDeviceInfo>& pDeviceInfo);
// 2、参数声明为指针类型
std::vector<DeviceData::DeviceInfo>* mDeviceInfo;
// 3、调用函数,指针转引用
Discover(*mDeviceInfo); //加上*就是指针转引用
- 引用没有const,指针有const;(指针有“指针常量” 即
int * const a
,但是引用没有int& const a
,不过引用有“常引用”即const int &a = 1
) -
引用在定义时需要添加&,在使用时不能添加&
,使用时添加&表示取地址
网友评论