前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++-入门语法(三)

C++-入门语法(三)

作者头像
cwl_java
发布2019-10-26 21:28:44
4770
发布2019-10-26 21:28:44
举报
文章被收录于专栏:cwl_Javacwl_Javacwl_Java
引用(Reference)
  • 在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
  • 在C++中,使用引用(Reference)可以起到跟指针类似的功能
  • 注意点
    • 引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
    • 对引用做计算,就是对引用所指向的变量做计算
    • 在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
    • 可以利用引用初始化另一个引用,相当于某个变量的多个别名
    • 不存在【引用的引用、指向引用的指针、引用数组】
  • 引用存在的价值之一:比指针更安全、函数返回值可以被赋值
  • 引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
  • 一个引用占用一个指针的大小
#include <iostream>
using namespace std;

struct Date {
	int year;
	int month;
	int day;
};

void test() {
	/*int age = 10;
	int &ref = age;*/

	/*Date d = {2011, 1, 5};

	Date &ref = d;
	ref.day = 2014;*/

	/*int age = 10;
	int *p = &age;
	int *&ref = p;
	*ref = 30;
	int height = 30;
	ref = &height;*/

	/*int array[] = {1, 2, 3};
	int (&ref)[3] = array;*/

	/*
	int *p;
	// 指针数组,数组里面可以存放3个int *
	int *arr1[3] = {p, p, p};
	// 用于指向数组的指针
	int (*arr2)[3];
	*/
}

void test1() {
	int height = 20;
	int age = 10;

	// ref1不能修改指向,但是可以通过ref1间接修改所指向的变量
	int & const ref1 = age;
	ref1 = 30;

	// ref2不能修改指向,不可以通过ref2间接修改所指向的变量
	int const &ref2 = age;
	// ref2 = 40;

	// p1不能修改指向,可以利用p1间接修改所指向的变量
	int * const p1 = &age;
	// p1 = &height;
	*p1 = 30;

	// p2可以修改指向,不可以利用p2间接修改所指向的变量
	int const *p2 = &age;
	p2 = &height;
	// *p2 = 30;

	/*int age = 10;
	const int &ref = age;
	const int *p = &age;
	ref = 30;
	*p = 30;

	cout << ref << endl;
	cout << *p << endl;*/
}

int func() {
	return 8;
}

int sum(int &v1, int &v2) {
	cout << "sum(int &v1, int &v2)" << endl;
	return v1 + v2;
}

int sum(const int &v1, const int &v2) {
	cout << "sum(const int &v1, const int &v2)" << endl;
	return v1 + v2;
}

void test2() {
	// 非const实参
	int a = 10;
	int b = 20;
	sum(a, b);

	// const实参
	const int c = 10;
	const int d = 20;
	sum(c, d);

	sum(10, 20);
}

// 不同编程语言转成的汇编是一样的么?
// Java、C++、OC、Swift写代码  --> 汇编\机器码(取决于CPU架构)
// X86 ARM
int main() {

	/*int age = 10;
	const long &ref = age;
	age = 30;

	cout << ref << endl;*/

	// 数组名arr其实是数组的地址,也是数组首元素的地址
	// 数组名arr可以看做是指向数组首元素的指针(int *)
	int arr[] = {1, 2, 3};
	// int (&ref)[3] = arr;
	int * const &ref = arr;

	// int age = 10;
	// const double &ref = age;

	//int a = 1;
	//int b = 2;
	//// const int &ref = 30;
	//// const int &ref = a + b;
	//const int &ref = func();

	getchar();
	return 0;
}
常引用
  • 引用可以被const修饰,这样就无法通过引用修改数据了,可以称为常引用
    • const必须写在&符号的左边,才能算是常引用
  • const引用的特点
    • 可以指向临时数据(常量、表达式、函数返回值等)
    • 可以指向不同类型的数据
    • 作为函数参数时(此规则也适用于const指针) ✓ 可以接受const和非const实参(非const引用,只能接受非const实参)
    • 可以跟非const引用构成重载
  • 当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
x64汇编要点总结
  • mov dest, src
    • 将src的内容赋值给dest,类似于dest = src
  • [ 地址值 ] 中括号[ ]里面放的都是内存地址
  • word是2字节,dword是4字节(double word),qword是8字节(quad word) ◼ call 函数地址
    • 调用函数
  • lea dest, [ 地址值 ] 将地址值赋值给dest,类似于dest = 地址值
  • ret
    • 函数返回
  • xor op1, op2
    • 将op1和op2异或的结果赋值给op1,类似于op1 = op1 ^ op2
  • add op1, op2
    • 类似于op1 = op1 + op2
  • sub op1, op2
    • 类似于op1 = op1 - op2
  • inc op
    • 自增,类似于op = op + 1
  • dec op
    • 自减,类似于op = op – 1 ◼ jmp 内存地址
    • 跳转到某个内存地址去执行代码
    • j开头的一般都是跳转,大多数是带条件的跳转,一般跟test、cmp等指令配合使用
变量地址的总结
  • 一个变量的地址值,是它所有字节地址中的最小值
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引用(Reference)
  • 常引用
  • x64汇编要点总结
  • 变量地址的总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档