读懂指针
来源:互联网 发布:打出货单软件 编辑:程序博客网 时间:2024/06/03 20:03
间接赋值才是指针存在的最大意义,指针做函数的参数才是指针的真谛
指针类型(*):指针是为内存服务的。指针指向谁就把谁的内存地址赋给指针。
1.指针也是一种变量,占有内存空间,用来保存内存块的地址
2.*p操作内存:在指针声明时,*号表示所声明的变量为指针;在指针使用时,*号表示 操作 指针所指向的内存空间中的值;*p相当于通过地址(p变量的值)找到一块内存;然后操作内存;*p放在等号的左边赋值(给内存赋值);*p放在等号的右边取值(从内存获取值);
3.指针变量和它指向的内存块是两个不同的概念,指针地址和指针地址批向的内存需要严格区分
4.指针是一种数据类型,是指它指向的内存空间的数据类型,因为数据类型不一样,导致指针移动的步长才会不一致。
5.对于C++编译器来说,指针只是一个变量,不管是一个*还是多个*的指针,C++编译器只会分配4个字节的内存。
注意:*表示指针,p表示指针变量,p指向的内存存放的是一个地址,*p是指针p的地址指向的内存的内容。给指针变量赋值,就是不断的改变指针的指向。释放指针指向的内存块时,指针指向的地址必需是内存块的首地址。
操作符
取地址运算符&(取变量的地址)与指针运算符*(从某个地址中获取数据),两者互为逆运算
指针的理解:
1.一 个基本的数据类型(包括结构体等自定义类型)加上“*”号就构成了一个指针类型的模子。这个模子的大小是一定的,与“*”号前面的数据类型无关。“*”号 前面的数据类型只是说明指针所指向的内存里存储的数据类型。所以,在32 位系统下,不管什么样的指针类型,其大小都为4byte。可以测试一下sizeof(void *)。
2.对指针进行加1 操作,得到的是下一个元素的地址,而不是原有地址值直接加1,所以一个类型为T 的指针的移动,以sizeof(T) 为移动单位。
使用:
1.定义指针变量的同时最好初始化为NULL,用完指针之后也将指针变量的值设置为NULL。也就是说除了在使用时,别的时间都把指针“栓”到0 地址处。这样它就老实了。
2.通过建立指针数组和行指针引用二维数组。
常见内存错误及对策:
1.指针没有指向一块合法的内存:结构体成员指针没有初始化、没有为结构体指针分配足够的内存、函数入口校验(使用指针前一定要保证指针是有效的)
2.为指针分配的内存太小:注意字符串常量末尾的'\0';
3.内存分配成功,但并未初始化:定义变量的时候第一步就进行初始化 操作,如:char *p = NULL;int a[10] = {0};
4.内存越界:一般是边界问题
5.内存泄漏:malloc的使用
6.内存释放:free() 斩断指针变量与这块内存的关系,在程序中malloc 的使用次数一定要和free 相等,否则必有错误;
7.内存释放之后:使用free 函数之后指针变量p 本身保存的地址并没有改变,我们需要重新把p的值变为NULL;释放完块内存之后,没有把指针置NULL,这个指针就成为了“野指针”:
间接赋值成立的条件:
1.参数定义:主调函数定义实参和形参;
2.建立关联:把实参地址传给形参;
3.间接赋值:在被调函数通过形参间接地修改实参的值;
应用场景:
1.3个条件都在一个函数里面,如通过指针循环给能数组赋值
2.条件1和2放在一个函数里面,条件3放在另一个函数里面,如下面的例子:
间接赋值的工程意义:
用1级指针(形参),去间接修改0级指针(实参)的值;
用2级指针(形参),去间接修改1级指针(实参)的值;
......
用n级指针(形参),去间接修改n-1级指针(实参)的值;
0 0
- 读懂指针
- 如何读懂C语言指针
- 如何读懂c语言指针
- 一篇文章读懂C的指针
- 指针理解入门(若读懂这些)
- 读懂指针申明的简单方法
- 读懂
- 读懂C语言中复杂的指针声明
- 读懂程序员
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- 读懂diff
- Java组合模式(Composite模式)
- Java适配器模式(Adapter模式)
- Java千百问_07JVM架构(011)_java垃圾回收都有哪些方式
- eclipse 如何提高开发效率
- 【笔记】对一个DOS病毒的分析
- 读懂指针
- cxf发布webservice简介 及 wsdl2java生成客户端代码
- NYOJ 91 阶乘之和
- 网站保存密码风险你知多少?
- CoreData进行数据持久化存储
- Neural Networks: Learning(Andrew ng ML)
- LeetCode - UniquePaths
- jdbc一个connection 下的事务问题[转]
- myeclipse中,项目上有个叉报错,文件没有错误【解决方案】