一、概念

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++总结笔记(二)——指针相关推荐

  1. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 变量的地址就是指针,存放指针的变量就是指针变量(因而又叫作地址变量 address variable); 这个地址编号本身就是一个无符号的整数,在32位系统下为4字节(8位 ...

  2. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云    邮箱: happylifemxy@163.com    期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  5. 数据结构自学笔记二、栈

    数据结构自学笔记二.栈 栈的定义 栈的作用 栈的顺序存储与随机存储 栈的基本功能的实现 先以顺序存储结构的栈为例. 然后再说说随机存储结构的栈吧 两栈共享空间 栈的一个重要应用--四则运算 算式的后缀 ...

  6. 嵌入式Linux驱动笔记(二十四)------framebuffer之使用spi-tft屏幕(上)

    你好!这里是风筝的博客, 欢迎和我一起交流. 最近入手了一块spi接口的tft彩屏,想着在我的h3板子上使用framebuffer驱动起来. 我们知道: Linux抽象出FrameBuffer这个设备 ...

  7. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7707628 作者:毛星云 邮箱: happ ...

  8. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  9. oracle直查和call哪个更快,让oracle跑的更快1读书笔记二

    当前位置:我的异常网» 数据库 » <>读书笔记二 <>读书笔记二 www.myexceptions.net  网友分享于:2013-08-23  浏览:9次 <> ...

  10. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

最新文章

  1. Facebook再曝数据丑闻删除应用数据仍会被泄漏
  2. 第三章 改进神经网络的学习方式(上)
  3. href 和 src 的区别
  4. Win32汇编---控件的超类化感想
  5. php里边的join,thinkphp中join用法
  6. 算法笔记_面试题_12.二叉搜索树的最近公共祖先
  7. 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
  8. 【OPENCV】运行opencv时找不到Qt库
  9. vue实现分屏_WebRTC如何在Vue.js 配合video标签实现多分屏功能?
  10. signature=e7b038f264f5a1cf5b8e81732b377b41,不同养生功法对2型糖尿病伴失眠患者抑郁,焦虑和睡眠质量的影响...
  11. 无需修改bios即可让任意主板实现NVME启动
  12. Java SSLSocket的使用
  13. 唯品会基于Kubernetes(k8s)网络方案演进
  14. 图像修复 图像补全_图像修复简介
  15. 基于主从博弈的智能小区代理商定价策略及 电动汽车充电管理matlab程序(yalmip+cplex)(yalmip+gurobi)
  16. 生产者消费者模型 android
  17. svg基础--基本语法与标签
  18. The request was rejected because the URL contained a potentially malicious String “;“问题的正确解决姿势
  19. webkit研究日记2
  20. 经典力学中最难的问题,至今没有答案

热门文章

  1. 收藏一些自己认为好的网站或博客
  2. vue.config和editorconfig
  3. ios怎样在一个UIImageButton的里面加一些自己定义的箭头
  4. spring-6、动态代理(cglib 与 JDK)
  5. mongodb环境安装
  6. 属性名、变量名与 内部关键字 重名 加
  7. 使用VS2005进行负载测试
  8. Webpack进阶(三)
  9. Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
  10. 基于django的视频点播网站开发-step11-后台用户管理功能...