C++总结笔记(二)——指针
一、概念
1.1 指针的原理
找到一个比较精练的概述指针原理的句子:
指针变量就是在内存中保存变量的地址,然后通过地址来访问数据。
int a = 1;
int* p = &a;
cout << p << endl;
009DFEB4
可以知道变量p在内存中的值就是a的地址,地址一般是16进制数。
然后我们可以通过解引用的方式来输出a的值。所谓解引用,就是通过指针的值即a的地址来找到a的值,具体方法就是在指针变量前加*。
cout << *p << endl;
可以知道,*p的值为1。
1.2 常量修饰指针
常量修饰指针分为常量指针、指针常量、常量指针和指针常量叠加。
1.2.1常量指针
常量指针通过const关键字修饰指针。
它的特点是指针变量指向的值不可以进行修改,但指向可以修改。
int a = 1;
int b = 2;
const int* p = &a;
*p = 2;//错误
p = &b;//正确
cout << *p << endl;
可以知道,*p的值为2。
1.2.2指针常量
指针常量是通过const来修饰指针变量p。
它的特点是指向的值可以进行修改,但指向不可以修改。
int a = 1;
int b = 2;int* const p = &a;
cout << *p << endl;
cout << p << endl;
//p = &b;错误
*p = 2;//正确
cout << *p << endl;
cout << p << endl;
1
0102FBE0
2
0102FBE0
可以看到,指针的值即指向的地址没有改变,其指向的值发生变化。
1.2.3常量指针和指针常量叠加
那const也可以既修饰指针又修饰指针变量的值,那么指向的值不可以进行修改,指向即地址也不可以修改。
const int* const p = &a;
其实简单的总结:const后面的值不能发生改变。
1.3 野指针
野指针是指指向非法的内存空间的指针。
1.指定义指针时未做初始化,因而不明确所指向的位置。
int * c = (int*)0x1234;//给指针自定义地址名,没有初始化,会变成野指针
int* d;//没有初始化,也为野指针
2.指new赋值的指针释放后没有归NULL
int* e = new int(1);cout << *e << endl;//只有指针b是正常的,现在将b释放,也会发生报错if(e != NULL){delete e;//此时e为野指针,需要将e置为NULLe = NULL;}
3.指针操作超越了作用域
1.4 this指针
C++中this指针指向的是被调用的成员函数所属的对象。
class Person
{
public:Person(int age){this->age = age;}int age;
};
1.5 空指针
是指指针指向内存编号为0的空间,相当于初始化,不可以访问。
int *p = NULL;
二、程序应用
2.1 在数组中应用指针
2.1.1 一维数组
我们发现数组的变量名其实就是地址,所以不需要用&来取地址。
int a[3] = {1, 2, 3};int* p = a;//p表示数组a中第一个元素的地址,p[0]则表示地址中的值即1。cout<<a<<endl;cout<<p[0]<<endl;for (int i = 0; i < 3; i++){cout << *p << endl;p++;//++相当于从首地址依次加4个字节到下一个数组元素的地址}
2.1.2 二维数组
int a[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
cout << a << endl;
int* p = a[0];//指向第0行。
int* p1 = a;//错误,二维数组的数组名表示的是第一个元素的地址,第一个元素是值数组的第0行,
所以不能指向整行,只能指向整行的元素。
cout << *p << endl;//也表示0行的第一个元素。
cout << p[0] << endl;//表示0行的第一个元素。
00B1FA0C
1
1
3
2.2 在函数中应用指针
int delete_1(int* p1, int* p2)
{int temp = *p1;*p1 = *p2;*p2 = temp;return *p1 - *p2;
}
int main()
{int a = 1;int b = 2;int c = delete_1(&a, &b);cout << a << endl;cout << b << endl;cout << c << endl;
}
2
1
1
与值传递不同,指针传递可以通过改变内存中的值的方法来改变实参。
2.3 实现冒泡排序
void Sort(int* p, int len)
{//实现冒泡排序for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - i - 1; j++){if (p[j] > p[j + 1]){int temp = p[j];p[j] = p[j + 1];p[j + 1] = temp;}} } //交换int var = p[0];p[0] = p[2];p[2] = var;//输出for (int k = 0; k < len; k++){cout << p[k];}
}
int main()
{int a[5] = {13, 1, 2, 5, 14};int len = sizeof(a) / sizeof(a[0]);Sort(a, len);
}
5211314
C++总结笔记(二)——指针相关推荐
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 变量的地址就是指针,存放指针的变量就是指针变量(因而又叫作地址变量 address variable); 这个地址编号本身就是一个无符号的整数,在32位系统下为4字节(8位 ...
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云 邮箱: happylifemxy@163.com 期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...
- PyTorch学习笔记(二)——回归
PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...
- 梓益C语言学习笔记之指针
梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...
- 数据结构自学笔记二、栈
数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...
- 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)
你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云 邮箱: happ ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...
- oracle直查和call哪个更快,让oracle跑的更快1读书笔记二
当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net 网友分享于:2013-08-23 浏览:9次 <> ...
- [转载]dorado学习笔记(二)
原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...
最新文章
- Facebook再曝数据丑闻删除应用数据仍会被泄漏
- 第三章 改进神经网络的学习方式(上)
- href 和 src 的区别
- Win32汇编---控件的超类化感想
- php里边的join,thinkphp中join用法
- 算法笔记_面试题_12.二叉搜索树的最近公共祖先
- 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
- 【OPENCV】运行opencv时找不到Qt库
- vue实现分屏_WebRTC如何在Vue.js 配合video标签实现多分屏功能?
- signature=e7b038f264f5a1cf5b8e81732b377b41,不同养生功法对2型糖尿病伴失眠患者抑郁,焦虑和睡眠质量的影响...
- 无需修改bios即可让任意主板实现NVME启动
- Java SSLSocket的使用
- 唯品会基于Kubernetes(k8s)网络方案演进
- 图像修复 图像补全_图像修复简介
- 基于主从博弈的智能小区代理商定价策略及 电动汽车充电管理matlab程序(yalmip+cplex)(yalmip+gurobi)
- 生产者消费者模型 android
- svg基础--基本语法与标签
- The request was rejected because the URL contained a potentially malicious String “;“问题的正确解决姿势
- webkit研究日记2
- 经典力学中最难的问题,至今没有答案