一、地址和指针

程序在编译过程中,系统会根据变量类型分配一定长度的内存单元。内存区中的每个字节都有一个编号,该内存单元的初始编号就是变量的"地址/指针",该内存单元的长度就是变量的"大小/空间"

二、*p是什么

int a = 100; //定义一个整形变量a,并赋初值100
int *p = a; //定义一个指针变量p指向整型变量a

说明:

  1. p的类型:int *  地址类型,去除变量名剩下的就是变量的类型

  2. a的类型: int  那么a空间的地址类型 就是 int *

  3. 怎么看一个空间的地址类型?:就是在这个空间类型基础上加一个  *

  4. 空间a的地址的表示:&a

*p是什么?

  第一种阐述:

    *p就是 p指向的空间  *p就是a

  第二种阐述:(计算机寻址方式)

    1. 找到指针变量p中存放的地址(门牌号)即空间的位置

    2. 取空间大小(p指向的空间大小)

三、指针的用途

1. 表示复杂的数据结构。所有数据类型地址都是一样的

2. 能够动态分配内存

3. 方便地使用字符串

4. 有效地使用数组

5. 调用函数获得1个以上结果。C函数只有一个返回值

6. 可以跨栈操作其他空间。知道变量/空间的地址 那么就可以操作变量/空间,夸函数操作变量必须要传地址

四、野指针

野指针造成的问题:

1. 不可预料

2. 不安全 危险

如何避免这个问题:

1. 声明指针变量之后,一定要给指针变量赋一个合法的空间地址(合法空间:必须是当前程序申请的空间 int a; int * p = &a;//这个a就是一个合法空间)

2. 只要使用指针变量一定要给这个指针变量赋一个合法的空间地址,否则会造成段错误或者bus error

五、数组和指针

C语言规定:

  1. 数组名a是数组首元素地址

  2. &a是数组的整个空间的地址

  3. &a的类型就是:就是数组类型基础上 + *,数组类型只能 在中间加内容。a数组类型:int a[5];&a类型:int (*) [5]

例:int (*p)[5] = &a

  1. p 指向整个数组空间

  2. &a+1表示:加了一个数组空间,加了1*sizeof(int[5]) = 20字节

  3. a+1表示:加了1*sizeof(int) = 4

说明:

1. 要想操作数组的所有元素,那么必须操作数组的首元素地址

2. int * p = (int *)(&a+1);//(int *)强制类型转换,否则会报错

3. 指针万能公式 :p[i] <==> *(p+i)

六、各种数据类型和其指针类型

各种数据的指针类型:

1. int p 和 int * p

整型变量p;整型变量的整型指针

2. int a[5] 和 int * a[5] 和 int (*a) [5]

整型数组;(整型指针)数组;整型(数组指针)。

指向数组类型的指针,必须使用括号。如果没有括号,表示一个具有n个int类型指针的数组。

3. int f(void) 和 int * f(void) 和 int (*f) (void)

参数为void,返回值类型为int的函数f;返回指针的函数;

4. int * * p

指针的指针;这里的p可以指向 上面的 a,p,f 表示(&p,&a,&f)

最新文章

  1. php时间类
  2. iOS重一些常用的代理模式
  3. codevs1842 递归第一次
  4. js树形控件
  5. JS常见问题
  6. visual studio粘贴html代码.会自行添加一些未知代码(自动格式化)
  7. 用C# sqlserver实现增删改查
  8. HTML语义化标签(二)
  9. MFC自绘(17篇)
  10. 一步步学习操作系统(2)——在STM32上实现一个可动态加载kernel的&quot;my-boot&quot;
  11. HDU3311Dig The Wells
  12. 【Storm篇】--Storm从初始到分布式搭建
  13. 原型设计软件介绍——Axure RPx
  14. Django项目配置日志
  15. LeetCode(94):二叉树的中序遍历
  16. Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序
  17. Java循环中标签的作用(转)
  18. aligned_storage简单学习
  19. django url 中的namespace详解
  20. Linux下安装scapy-python3

热门文章

  1. 可定制的分词库——Yaha(哑哈)分词
  2. (Python编程)Pickle对象
  3. Eclipse调试Java程序技巧
  4. 06_android虚拟机介绍 05_sdkManager介绍
  5. AngularJs(Part 6)
  6. Asp.net 微信企业号网页开发流程
  7. SCSS 中的 &amp;::before 和 &amp;::after
  8. idea中java项目增加module后,增加的目录(src)无法增加包(Package)
  9. 引用静态资源的url添加版本号,解决版本发布后的浏览器缓存有关问题
  10. 【关于java多线程和socket通信的一些记录】---高并发/高负载/高可用/重入锁