C/C++学习之指针

  • 1 任意“指针”类型大小
  • 2 野指针
  • 3 空指针
  • 4 万能指针/泛型指针(void *)
  • 5 指针和数组
  • 6 指针加减运算
  • 6 指针比较运算
  • 7 指针数组
  • 8 数组指针
  • 9 多级指针

1 任意“指针”类型大小

指针的大小与类型 无关。 只与当前使用的平台架构有关。
32位:4字节。
64位: 8字节。

2 野指针

1) 没有一个有效的地址空间的指针。int *p;*p = 1000;需要注意,下面这种方法是对的,因为分配的地址不是无效的,而是str的地址:int str = 2;int* p;p = &str;2)p变量有一个值,但该值不是可访问的内存区域。//默认将0-255的地址给操作系统使用,所以不可以使用。//但是有些地址也是不一定可以使用的。 int *p = 10;   *p = 2000;【杜绝野指针】

3 空指针

int *p = NULL;     #define NULL ((void *)0)*p 时 p所对应的存储空间一定是一个 无效的访问区域。

4 万能指针/泛型指针(void *)

可以接收任意一种变量地址。但是,在使用【必须】借助“强转”具体化数据类型。char ch = 'R';void *p;  // 万能指针、泛型指针p = &ch;printf("%c\n", *(char *)p);

5 指针和数组

数组名:  【数组名是地址常量】 --- 不可以被赋值。   ++ / -- / += / -= / %= / /=  (带有副作用的运算符)指针是变量。可以用数组名给指针赋值。 ++ -- 取数组元素:int arr[] = {1,3, 5, 7, 8};int *p = arr;  arr[i] == *(arr+0) == p[0] == *(p+0)指针和数组区别:1. 指针是变量。数组名为常量。2. sizeof(指针) ===》 4字节 / 8字节sizeof(数组) ===》 数组的实际字节数。指针++ 操作数组:int arr[] = { 1, 2, 4, 5, 6, 7, 8, 9, 0 };int *p = arr;      for (size_t i = 0; i < n; i++){printf("%d ", *p);p++;  // p = p+1;   一次加过一个int大小。 一个元素。}p的值会随着循环不断变化。打印结束后,p指向一块无效地址空间(野指针)。

6 指针加减运算

数据类型对指针的作用:1)间接引用:决定了从指针存储的地址开始,向后读取的字节数。  (与指针本身存储空间无关。)2)加减运算:决定了指针进行 +1/-1 操作向后加过的 指针的字节数。如果是char加1,如果是short加2。指针 * / % : error!!!指针 +- 整数:1) 普通指针变量+-整数char *p; 打印 p 、 p+1  偏过 1 字节。short*p; 打印 p 、 p+1  偏过 2 字节。int  *p; 打印 p 、 p+1  偏过 4 字节。        2)在数组中+- 整数short arr[] = {1, 3, 5, 8};int *p = arr;p+3;          // 向右(后)偏过 3 个元素p-2;            // 向前(左)偏过 2 个元素3)&数组名 + 1加过一个 数组的大小(数组元素个数 x sizeof(数组元素类型))指针 +- 指针:指针 + 指针: error!!!指针 - 指针:1) 普通变量来说, 语法允许。无实际意义。【了解】2) 数组来说:偏移过的元素个数。

6 指针比较运算

1) 普通变量来说, 语法允许。无实际意义。2) 数组来说:   地址之间可以进行比较大小。可以得到,元素存储的先后顺序。3) int *p;p = NULL;      // 这两行等价于: int *p = NULL;if (p != NULL)printf(" p is not NULL");else printf(" p is NULL");

7 指针数组

定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。
这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示。
只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。1) int a = 10;int b = 20;int c = 30;int *arr[] = {&a, &b, &c}; // 数组元素为 整型变量 地址
2) int a[] = { 10 };int b[] = { 20 };int c[] = { 30 };int *arr[] = { a, b, c }; // 数组元素为 数组 地址。 指针数组本质,是一个二级指针。二维数组, 也是一个二级指针。

8 数组指针

数组指针(也称行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]所以数组指针也称指向一维数组的指针,亦称行指针。

9 多级指针

int a = 0;int *p = &a;                 一级指针是 变量的地址。int **pp = &p;             二级指针是 一级指针的地址。int ***ppp = &pp;            三级指针是 二级指针的地址。  int ****pppp = &ppp;           四级指针是 三级指针的地址。  【了解】
......多级指针,不能  跳跃定义!对应关系:ppp == &pp;         三级指针*ppp == pp == &p;           二级指针**ppp == *pp == p == &a               一级指针***ppp == **pp == *p == a             普通整型变量*p : 将p变量的内容取出,当成地址看待,找到该地址对应的内存空间。如果做左值: 存数据到空间中。如果做右值: 取出空间中的内容。

C/C++学习之指针基础相关推荐

  1. 【C语言学习】国嵌21__指针基础

    2019独角兽企业重金招聘Python工程师标准>>> 一.指针基础 变量只是一段存储空间的别名,那么是不是必须通过这个别名才可以使用这段存储空间?答案是否定的.我们还可以通过指针也 ...

  2. c# out原理 ref_3-Unity入门学习之C#基础2「数据类型」

    3-Unity入门学习之C#基础2 一.C#的数据类型 C#中,变量主要包含以下三种类型: 1.1.值类型 1.1.1.值类型介绍 ①结构[struct]:包含(整型.浮点型.128 位数据类型(de ...

  3. Qt学习之Qt基础入门(中)

    1. 前言 上一篇博客,总结了Qt的一些基础用法,这篇博客继续跟视频学习Qt的常用方法 Qt入门系列: Qt学习之C++基础 Qt学习之Qt安装 Qt学习之Qt基础入门(上) Qt学习之Qt基础入门( ...

  4. c语言中shift f12组合建,C++学习1-(C语言基础、VS快捷键)

    C语言基础复习 1.三码 正数: 3码合1 ,正数的反码/补码就是其本身 负数: 原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值 原码:11010101 负数的反码是在其原码的基础上 ...

  5. Java学习日记1——基础认知

    Java学习日记1--基础认知 学习Java阶段,如果发现不正确的描述,还请指正! 首先附上Java相关下载链接和配置教程链接 Java相关软件工具下载地址:官方下载 Java环境配置(win10配置 ...

  6. Java零基础学习Java编程语言基础知…

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.下面就说说Java零基础学习Java编程语言基础知识的几个要点.希望能够对Java编程基础入门学习的新手有帮助 ...

  7. 计算机科学与技术学习路线编程基础四大件应用实践编程(含C++学习路线)

    计算机科学与技术学习路线&编程基础四大件&应用实践编程(含C++学习路线) 基本介绍 本人211科班出身,目前大学临近毕业,想给迷茫的同行者或者后来人一些建议和推荐,少走弯路.想想自己 ...

  8. 【C语言】指针基础知识点汇总

    指针(一) 基础 一 指针的概念 为了方便访问内存中的内容,给每个内存单元一个编号,我们称这个编号为地址,及为指针. 指针也是一种数据类型 所以指针都有自己的内存 存储的是地址(编号) 指针的四要素 ...

  9. C++ 【学习笔记】 - 基础(class、inline、explict、new、delete、static、this、mutable、friend、operator、virtual)

    上上一篇:java全家桶 上一篇:C语言 [学习笔记] - 基础.理论(原码/反码/补码).函数(字符串.定义).指针.内存(函数.结构).复合类型.函数(调用原理.指针.接口) 视频:https:/ ...

最新文章

  1. 周报速递丨《网络安全审查办法》修订发布;微信支持数字人民币支付
  2. Mercury LoadRunner
  3. tomcat web应用_具有可执行Tomcat的独立Web应用程序
  4. spoj1026 favorite dice
  5. 【51Nod - 1133】不重叠的线段 (贪心)
  6. 【原】jQuery编写插件
  7. java tostring格式_如何在Java中使用toString()获得数字的字符串表示形式?
  8. springcloud中config和bus的使用
  9. vSphere 故障排除之网络篇
  10. c大小写转换函数_字符处理——大小写转换编程思路扩展
  11. 如何将JavaScript日期转换为UTC?
  12. CCF201609-1 最大波动(100分)
  13. O_RDONLY/O_NOATIME undeclared (first use in this function
  14. 拉登是我罩的队_软件需求规格说明书
  15. 什么是企业OA管理系统?企业公司oa管理系统软件价格攻略
  16. Android8.1 APK安装过程源码解析
  17. 数据库知识总结:sqlserver中事务总结:begin tran,rollback tran,commit tran +IndexDB总结...
  18. Qt5.12.6 + VS2019添加图片资源文件
  19. 能力清单:透视成功逻辑,学会清单练习
  20. 物理建模钢琴-Modartt Pianoteq Pro v6.7.0 WiN

热门文章

  1. element table v-for动态隐藏列
  2. “芯片荒”危机致汽车销量持续下滑,加快推进智慧供应链深化应用迫在眉睫
  3. mac上配置谷歌与火狐浏览器驱动环境
  4. python发朋友圈源码_用Python发一个高逼格的朋友圈【附代码】
  5. 剧情介绍:“傲慢与偏见”经典名著
  6. C语言每日一练——第79天:高次方数的尾数
  7. [学员投稿]thinkphp漏洞扫描
  8. SOME/IP协议详解「总目录」
  9. 安卓错误: 找不到R符号_铜丝氧化却找不到原因?你可能忽视了这几个常见错误!【辽宁津达线缆】...
  10. C语言学习手记-一元二次函数解法