C 碎片七 指针
2016-06-21 15:39
141 查看
一、地址和指针
程序在编译过程中,系统会根据变量类型分配一定长度的内存单元。内存区中的每个字节都有一个编号,该内存单元的初始编号就是变量的"地址/指针",该内存单元的长度就是变量的"大小/空间"二、*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]
整型数组;整型指针数组
3. int (*a) [5]
指向(含n个元素的一维数组)二/多维数组的指针变量
4. int f(void) 和 int * f(void) 和 int (*f) (void)
参数为void,返回值类型为int的函数f;返回指针的函数;
5. int * * p
指针的指针;这里的p可以指向 上面的 a,p,f 表示(&p,&a,&f)
相关文章推荐
- mysql binlog 数据介绍
- leetcode 24. Swap Nodes in Pairs
- tomcat启动项目被重新加载,导致资源初始化两遍
- 第八篇Bootstrap下拉菜单实例代码
- WMI使用的WIN32_类库名 .
- centos minimal虚拟机测试javaee配置
- 对象的强、软、弱和虚引用
- MUI传值
- 分组依据一列数据的最大或者最小值查询查询其他列对应数据
- PLS-00306:错误解决思路 - OracleHelper 执行Oracle函数的坑
- 小型isp开源计费系统官网
- 中文乱码解决防范-奇特
- xdebug(32) : warning C4229: 使用了记时错误 : 忽略数据上的修饰符
- 设置系统外观属性
- A/B Test测试完全指南
- 如何android多Activity间共享数据 (extends Application)
- leetcode 25. Reverse Nodes in k-Group
- jquery选择器
- 表格数据通过点击传数据给Bootstrap模态窗口
- 前端验证 validform