指针,32位系统一定占据4个字节,64位系统一定占8个字节

定义指针

int* a{};
std::cout<<a<<std::endl;
int *b{};
std::cout<<b<<std::endl;

上面定义了一个int类型的指针,a表示指针起始地址,因为int的大小是4,所以int*的意思是指针每次移动都移动4个字节

int a = 666;
//获取a的内存地址,是pa,C++中使用&符号来获取指定变量的内存地址
int* pa = &a;
//在pa前面加个星号,*pa叫做间接运算符,C++中使用间接运算符来修改内存的值
*pa = 777;
std::cout << a;

指针数组(注意不是数组指针)

int a[3]{11,22,33};
int * pa[3]{};
for (int i = 0; i < 3;i++) {pa[i] = &a[i];
}
for (int* p:pa) {std::cout << p << std::endl;
}

关于指针的移动

int  a = 9999;
long long b = 9999;
// 挪动1次指针,指针走4个字节,因为int是4个字节
std::cout << &a << std::endl;
std::cout << &a+1 << std::endl;
// 挪动1次指针,指针走8个字节,因为longlong是8个字节
std::cout << &b << std::endl;
std::cout << &b+1 << std::endl;

先说指针类型转换,下面演示将一个int类型的指针转换成char类型的指针

int main()
{int a = 1;char *p = (char*)&a;std::cout << &a <<"\n";std::cout << p << "\n";
}

上面的代码第二次打印的时候会打印出乱码,
因为是个char是字符类型,所以cout把char类型的指针当做字符串来处理,打印的时候会以’\0’结束,但是指针是没有’\0’的,所以乱码,此时应该将上面的代码再次转换成void类型的指针,如下

int main()
{int a = 1;char *p = (char*)&a;std::cout << &a <<"\n";std::cout << (void*)p << "\n";
}

这样两次打印的地址就是相同的了

为指针区分不同的类型,意义在于从一个变量的首地址读取数据的时候,具体读多长。比如一个CPU可以根据该指针是int类型,那么一次就读取4个字节的长度,如果是char类型,就读取1个字节的长度
所以int类型的指针++一次,是加4个字节,而char类型指针++一次是1个字节

指针自增

int a = 666;
int* pa = &a;
std::cout << pa << std::endl;
// 注意这个写法,先打印pa所指向的值,然后指针再加1
std::cout << *pa++ << std::endl;
std::cout << pa << std::endl;

指针的指针,最后一个指针,叫做基址,就是下面代码的ppa,修改**ppa的时候,并不是修改pa,而是直接修改了它最终指的那个值

int a = 666;
int* pa = &a;
int** ppa = &pa;
**ppa=777;
std::cout << *pa << std::endl;//打印出777

常量的指针(const int*)

const int a = 666;
const int* pa = &a;
//*pa = 55;此处报错,不允许修改a的值
std::cout << *pa << std::endl;
//--------------------------
//所以我们定义一个int类型指针,而不是常量int指针,像下面这样
int* pb = (int*)&a;
*pb = 55;
std::cout << *pb << std::endl;
// 然后接下来我们继续输出a的值,很有意思,a的值并没有被改
std::cout << a << std::endl;//666

指针常量(注意不是常量的指针)

int a = 666;
int b = 0;
int* const pa = &a;
//pa = &b;此处报错,pa只能只想a所在的地址,不可以在指向其他位置,但是a的值可以改
std::cout << *pa << std::endl;

个人总结:关于星号与const的优先级,星号的优先级更高,星号修饰什么,就是什么的指针,比如星号修饰const int,那么这就是常量的指针,星号只修饰int,那么这是int类型的指针,知道该指针类型了,然后再看const就好记了

一维数组指针

int a[2] = { 11,12 };
int* pb = a;
//打印出12
std::cout << pb[1]<< std::endl;

多维数组指针

// 定义一个2行,3列的数组
int a[2][3] = {{11,12,13},{21,22,23}
};
//此处的3,就是列数,上面数组是几列,此处就要写几
int (*pa)[3]=a;
//因为这是数组指针,所以它有下面这种特性
std::cout << pa[0][2] << std::endl;//打印出13
//下面这行代码强转,也可以与一维数组一样,只不过这样没有了多维数组的指针特性,仅此而已
int* pb = (int*)a;

多维数组指针的挪动(注意不包括一维数组)

int a[2][3] = {{11,12,13},{21,22,23}
};
int(*pa)[3] = a;
std::cout << pa << std::endl;
//因为定义了每行三条数据
//所以此处比上一行多出12
std::cout << pa+1 << std::endl;

C++自学20:指针/指针的指针/const相关推荐

  1. C++阶段01笔记08【结构体(基本概念、定义与使用、数组、指针、嵌套、const使用)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 8 结构体 8.1 结构体基本概念 8.2 结构体定义和使用 示例 8.3 结构体数组 示例 8.4 结构体指针 示例 8.5 ...

  2. 指针、引用以及const限定符、constexpr限定符

    文章目录 复合类型 引用 概念与使用 引用的定义 注意 指针 概念 声明方式 取地址符 指针值 空指针 利用指针访问对象 赋值和指针 void* 指针 指向指针的指针 指向指针的引用 初始化所有指针 ...

  3. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数

    十一.指针 (1)指针的定义和使用 指针的作用:可以通过指针间接访问内存. 参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&a ...

  4. 指针、引用、const、类的浅显理解

    指针.引用.const.类的浅显理解 一.引用 1.1 理解与实验 和const 1.1.1 实验一 1.1.1 实验二 二.指针 三.指针和引用的区别 四.const(const和pointer) ...

  5. 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr

    C++ Primer第二章的内容主要介绍了变量和基础类型,包括C++语言定义的基础内置类型.变量的定义及声明.符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍,本次博客也从这 ...

  6. 常量指针(Pointer to const)与指针常量(Const pointer)

    常量指针(Pointer to const)与指针常量(Const pointer) 1. Concepts 很多时候对于这两个概念的困惑来自于中文字面翻译.我们无法通过字面含义直接理解判断该'常量' ...

  7. const指针、数组指针、指针数组理解

    指针中,关键字const放在不同的位置表示的意义: 1.const int *p; 这种情况下,表示的是一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指 ...

  8. C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08

    文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...

  9. const指针强转为非const指针后的赋值问题

    #include <iostream>using namespace std;int main() {const int a = 5;const int * p = &a;int ...

  10. C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针

    const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...

最新文章

  1. 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
  2. TensorFlow2简单入门-单词嵌入向量
  3. WebLogic Server的单点登陆功能--转载
  4. c语言不允许对数组的大小做动态定义,数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt...
  5. filter函数的用法_动态数组函数系列5| 筛选函数FILTER,单条件多条件动态筛选
  6. 刷题总结——xor(ssoj)
  7. [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件
  8. Sql Like 通配符 说明
  9. mysql支持数据安全的引擎_2、MySQL常见数据库引擎及比较?
  10. WEB前端性能优化总结——如何提高网页加载速度
  11. 线性代数辅导讲义(第六章 二次型)
  12. edp和edt哪个好_菲拉格慕香水edp和edt的区别 选择适合自己的香水方法
  13. 头晕和眩晕是怎样的感觉?3件小事来缓解!
  14. Java URI 和 android Uri 中的 getSchemeSpecificPart() 方法
  15. DEV-C++下载、安装、使用教程(文件、项目)
  16. NSN 内部推荐 -- 不能从电子邮件地址认证身份和来源.
  17. 手部IK,自制动画,蒙太奇——开门手臂自动弯曲、靠墙手自动扶墙
  18. easypoi 模板语法
  19. 全功能DB数据库管理工具,超赞,完全支持所有主流数据库
  20. 麒麟系统在线安装docker(x86/arm)

热门文章

  1. mysql开启binlog日志影响性能吗_mysql binlog日志优化及思路
  2. 计算机三级之嵌入式系统学习笔记7
  3. java高级流程控制多线程作业设计_Java高级-解析Java中的多线程机制
  4. Python标准库中的shutil
  5. Java中System.nanoTime()的使用
  6. apache+mysql+wordpress的安装建站
  7. java cookie包_Java cookie的使用
  8. js数组获取index_通过事例重温一下常见的 JS 中 15 种数组操作(备忘清单)
  9. [OGG] [INS-75012] GoldenGate重装报错
  10. python大法之二-一些基础(一)