C++自学20:指针/指针的指针/const
指针,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相关推荐
- C++阶段01笔记08【结构体(基本概念、定义与使用、数组、指针、嵌套、const使用)】
C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 8 结构体 8.1 结构体基本概念 8.2 结构体定义和使用 示例 8.3 结构体数组 示例 8.4 结构体指针 示例 8.5 ...
- 指针、引用以及const限定符、constexpr限定符
文章目录 复合类型 引用 概念与使用 引用的定义 注意 指针 概念 声明方式 取地址符 指针值 空指针 利用指针访问对象 赋值和指针 void* 指针 指向指针的指针 指向指针的引用 初始化所有指针 ...
- c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
十一.指针 (1)指针的定义和使用 指针的作用:可以通过指针间接访问内存. 参考视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&a ...
- 指针、引用、const、类的浅显理解
指针.引用.const.类的浅显理解 一.引用 1.1 理解与实验 和const 1.1.1 实验一 1.1.1 实验二 二.指针 三.指针和引用的区别 四.const(const和pointer) ...
- 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr
C++ Primer第二章的内容主要介绍了变量和基础类型,包括C++语言定义的基础内置类型.变量的定义及声明.符合类型如指针及引用的介绍和const及常量表达式constexpr的介绍,本次博客也从这 ...
- 常量指针(Pointer to const)与指针常量(Const pointer)
常量指针(Pointer to const)与指针常量(Const pointer) 1. Concepts 很多时候对于这两个概念的困惑来自于中文字面翻译.我们无法通过字面含义直接理解判断该'常量' ...
- const指针、数组指针、指针数组理解
指针中,关键字const放在不同的位置表示的意义: 1.const int *p; 这种情况下,表示的是一个指向常量的指针,程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指 ...
- C语言-指针-基础用法、运算、指针与数组、指针数组、多级指针、void指针和const修饰符-学习笔记08
文章目录 1. 地址和变量 2. 指针 2.1 基本声明 2.2 指针的目标 3. 指针的运算 3.1 指针的赋值运算 3.2 指针的算术运算 3.2.1 指针与常量的加法与减法 3.2.2 两指针相 ...
- const指针强转为非const指针后的赋值问题
#include <iostream>using namespace std;int main() {const int a = 5;const int * p = &a;int ...
- C语言特殊指针——const指针、void指针、NULL指针、零指针、野指针
const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性 指向常量的指针: const int *pa; int const *pa; 两者等 ...
最新文章
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
- TensorFlow2简单入门-单词嵌入向量
- WebLogic Server的单点登陆功能--转载
- c语言不允许对数组的大小做动态定义,数组,C语言程序设计课件,与中南大学出版社教材相配套.ppt...
- filter函数的用法_动态数组函数系列5| 筛选函数FILTER,单条件多条件动态筛选
- 刷题总结——xor(ssoj)
- [转]Eclipse插件开发之基础篇(2) 第一个Eclipse插件
- Sql Like 通配符 说明
- mysql支持数据安全的引擎_2、MySQL常见数据库引擎及比较?
- WEB前端性能优化总结——如何提高网页加载速度
- 线性代数辅导讲义(第六章 二次型)
- edp和edt哪个好_菲拉格慕香水edp和edt的区别 选择适合自己的香水方法
- 头晕和眩晕是怎样的感觉?3件小事来缓解!
- Java URI 和 android Uri 中的 getSchemeSpecificPart() 方法
- DEV-C++下载、安装、使用教程(文件、项目)
- NSN 内部推荐 -- 不能从电子邮件地址认证身份和来源.
- 手部IK,自制动画,蒙太奇——开门手臂自动弯曲、靠墙手自动扶墙
- easypoi 模板语法
- 全功能DB数据库管理工具,超赞,完全支持所有主流数据库
- 麒麟系统在线安装docker(x86/arm)
热门文章
- mysql开启binlog日志影响性能吗_mysql binlog日志优化及思路
- 计算机三级之嵌入式系统学习笔记7
- java高级流程控制多线程作业设计_Java高级-解析Java中的多线程机制
- Python标准库中的shutil
- Java中System.nanoTime()的使用
- apache+mysql+wordpress的安装建站
- java cookie包_Java cookie的使用
- js数组获取index_通过事例重温一下常见的 JS 中 15 种数组操作(备忘清单)
- [OGG] [INS-75012] GoldenGate重装报错
- python大法之二-一些基础(一)