从零开始学习c++之初识指针和引用
来源:互联网 发布:ubuntu 网络设置 编辑:程序博客网 时间:2024/06/14 08:06
指针:
指针(pointer) 是一个值为内存地址的变量 内存地址一般使用16进制表示比如0028FF44
指针的本质只是一个变量,指针大小为4个字节
指针的声明:
//第一种声明方式int* ptr_i1; //偏向于地址,p理解为一个地址变量,int*是类型 //第二种声明方式int *ptr_i2; //偏向于值,*p理解为一个int型变量,能表示一个整型值//其他两种声明方式int * ptr_i3;int*ptr_i4;
关于指针声明方式*位置的不同:一元运算符*是间接寻址或间接引用运算符,当它作用于指针时,将访问指针所指向的对象。int *ptr这样声明时便于记忆,该声明的表达式*ptr的结果是int类型,一般使用这种声明方式。
指针的赋值:
int i1; //变量i1 = 100; ptr_i1 = &i1; //&表示获取地址变量*ptr_i1 = 200; //*表示取地址变量所对应的变量cout << *ptr_i1<<endl; //输出200 cout << i1<<endl; //输出200为指针赋值时,赋值运算符右侧必须是一个地址
指针类型:
//1.空指针//一般指针初始化值为nullptr 必须初始化所有指针int *ptr1 = nullptr; //等价于 int *ptr1= 0; nullptr特殊的字面量的值,可以转化为任意指针类型//指针也可以赋值NULL 等价于nullptr 但需要包含头文件cstdlibint *ptr2 = NULL;cout << endl;//2.void *指针//void*指针存放一个内存地址,地址指向的内容是什么类型不能确定,所以用void*指针取得的变量不能修改变量值//void*指针一般用途:用于和别的指针比较、作为函数的输入和输出、赋值给另一个void*指针double num = 3.14;double *ptrNum1 = #void *ptrVoid1 = #cout << (ptrVoid1 == ptrNum1);//*ptrVoid1 = 4.11; //无法这样修改,因为void*指针类型不确定 报错:表达式必须是指向完整对象类型的指针
指针与数组:
//数组存储在一块连续的内存空间,数组名是这块连续内存空间的首地址double nums[5] = { 23,52,77,25,89 };double *ptrNum = nullptr;ptrNum = nums; //直接指向数组//ptrNum = &nums[5]; //指向数组某个元素cout << ptrNum[3] << endl; //当指针指向某一个数组,指针可以视为数组使用,因为数组名等于数组的首地址cout << sizeof(ptrNum) << endl; //输出为4 指针变量占4个字节
指针的递增和递减:
double scores[5] = { 55,29,19,66,82 };double *ptr_scores;ptr_scores = scores;for (int i = 0;i < 5;i++){cout << *ptr_scores++ << endl; //指针的++和--相当于指针在内存空间的平移,移动单位为T的大小}cout << endl;ptr_scores -= 2; cout << *ptr_scores << endl; //输出66
引用:
//引用:为对象起了另外一个名字int value = 1024;int &refValue = value; //refValue 指向value,是value的引用//错误引用: int &refValue2; //引用必须被初始化//注意:引用并非对象,只是对一个已经存在的对象起的别名//引用只能绑定在对象上,不能指向一个字面值或者表达式 //错误写法:例如 int &refNum = 10; //但有一种情况可以把引用指向一个常量const double &refCon = 10; //正确写法 表示常量引用//引用必须被初始化,所以使用引用前不需要测试有效性,使用引用比使用指针效率高
指针与引用的关系:
1.引用是一种进行了简单封装的引用
2.引用底层仍然是指针,获取引用地址时,编译器会进行内部转换
3.引用的直接目的是为了让代码编写更加流畅
指针的简单应用:
使用指针来对一个数组进行逆序操作:
//逆序:首元素和尾元素交换int arrays[8]{ 25,29,8,18,53,44,65,32};int *ptr_start = arrays; //一个指针指向第一个元素int startCount = 0;int *ptr_end = arrays + 7; //另一个指针指向最后一个元素int endCount = 7;int temp = 0; //临时变量用于交换while (ptr_start < ptr_end){temp = *ptr_start;*ptr_start = *ptr_end;*ptr_end = temp;ptr_start++;ptr_end--;cout << ptr_start << "\t" << ptr_end << endl;}for (int i = 0;i < sizeof(arrays) / sizeof(int);i++){cout << arrays[i] << endl;}
指针-自由空间分配:
//使用new来请求系统系统从自由空间分配内存//new 返回一个指向分配的内存的指针int *p1 = new int; //分配1个intint *p2 = new int[5]; //分配5个intdelete p1; //释放由new分配的内存 //使用new创建动态分配的数组int *intArray = new int[10];//使用delete[]释放内存delete[] intArray;delete和new的使用:
1.delete与new配对,不要使用delete释放不是new的内存
2.不能释放已经释放的内存
3.使用delete[]来释放用new[]为数组分配的内存
阅读全文
0 0
- 从零开始学习c++之初识指针和引用
- C++Primer 学习笔记之指针和引用
- C和指针之初识篇
- [C学习]指针初识
- C++Primer学习概要:引用和指针
- C++Primer学习之一引用和指针
- 15.从零开始学习C语言--指针和数组
- c++学习篇之【指针和引用】
- c++:引用和指针
- 从零开始学习Python(一) 之初识python
- 初识C++之指针与引用
- C语言之指针--初识指针
- 14.从零开始学习C语言--指针
- 17.从零开始学习C语言--多级指针
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- 从零开始学C++之从C到C++(二):引用、数组引用与指针引用、内联函数inline、四种类型转换运算符
- 【C/C++学习】之一、指针和引用的区别
- HDU
- SpringBoot--Profile
- spring boot 项目三种启动方式
- 电路实验
- 控制C#中textbox输入文本的格式
- 从零开始学习c++之初识指针和引用
- Java线程学习笔记(一)
- 2017/11/20
- C++PrimerPlus第一章学习随笔
- Oracle监听文件路径
- Opencv如何读取矩阵的某一行(从描述子矩阵中读取某一特征点的描述子)
- 值得借鉴:耗时两个月的求职经历
- HDU 1727:Hastiness
- JavaScript学习笔记——函数