C 碎片七 指针
一、地址和指针
程序在编译过程中,系统会根据变量类型分配一定长度的内存单元。内存区中的每个字节都有一个编号,该内存单元的初始编号就是变量的"地址/指针",该内存单元的长度就是变量的"大小/空间"
二、*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)
C 碎片七 指针的更多相关文章
- IP 碎片重组
IP 碎片重组 内核中的IP重组函数. struct sk_buff * ip_defrag(struct sk_buff * skb, u32 user) { ...... //如果内核范围超出限制 ...
- GO语言的进阶之路-go的程序结构以及包简介
GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...
- c++ primer plus 第6版 部分一 1-4章
c++ primer plus 第6版 源代码 ---编译器---目标代码---连接程序(启动代码--库代码)---可执行代码 源代码扩展名:c cc cxx C cpp ...
- C++内存管理剖析
C++内存管理 C++中有四种内存分配.释放方式: 最高级的是std::allocator,对应的释放方式是std::deallocate,可以自由设计来搭配任何容器:new/delete系列是C++ ...
- C和指针 (pointers on C)——第七章:函数(上)
第七章 函数 这一章对于有一定C的基础的人有一定优秀代码风格的人来说,并非非常虐.关于stdarg宏可能有些陌生.它负责可变參数列表的定义. 总结: 新式风格和旧式风格就不要提了.八百年前的事情. 函 ...
- Android学习之基础知识七—碎片的最佳实践
一.Android碎片(Fragment)的最佳实践——简易版新闻应用 第一步:新建FragmentBestPractice项目,在app/build.gradle当中添加:RecyclerView ...
- 程序设计入门-C语言基础知识-翁恺-第七周:指针与字符串-详细笔记(七)
目录 第七周:指针与字符串 7.1 指针初步 7.2 字符类型 7.3 字符串 7.3 课后练习 第七周:指针与字符串 7.1 指针初步 sizeof 是一个运算符,给出某个类型或变量在内存中所占据的 ...
- PHP的七个数组指针函数
1. PHP的七个数组指针函数 函数 描述 reset() 将一个数组的内部指针重置到首位,并返回第一个元素的值 end() 将一个数组的内部指针移动到数组的最后一个元素所在的位置,并返回最后一个元素 ...
- C和指针 第七章 习题
7.1 hermite递归函数 int hermite(int n, int x) { if (n <= 0) { return 1; } if (n == 1) { return 2 * x; ...
随机推荐
- 在Oracle中设置主键自增
转自:https://www.2cto.com/database/201705/636725.html 数据库设置主键自增">oracle数据库设置主键自增: --创建表 create ...
- Mysql 增量备份和全量备份
全量备份: # vim /root/DBFullyBak.sh //添加以下内容 #!/bin/bash # Program # use mysqldump to Fully backup mysql ...
- (转)64位系统安装Delphi7提示Can’t load package:dclite70.bpl 以及 提示地址错误
第一个问题: 今天在64的Win7上安装Delphi7,在启动时候出现如下提示: Can't load package:dclite70.bpl 告诉大家一个解决办法,就是给Delphi32.exe去 ...
- 9、par画图参数
转载:http://blog.sina.com.cn/s/blog_8f5b2a2e0102v0tf.html 1. 函数par()的使用格式如下: par(..., no.readonly = FA ...
- p2921 Trick or Treat on the Farm
传送门 题目 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果.农场不大,所以约翰要想尽法子让奶牛们得到快乐 ...
- C# 生成chm帮助文件
引用博友的博客地址,里面有详细资料,谢谢博主分享 http://blog.csdn.net/snakorse/article/details/44963015
- 7.29实习培训日志-Oracle题目
总结 这周主要学习了SQL,oracle中的SQL基础,以前学习的是SQLserver的SQL,和oracle的还是有略微不同,所以重新去学习了一段时间,然后对于oracle中的各种函数有了初步了解, ...
- MIC-3395单板机不识别PCI设备
硬件环境: 单板机:MIC-3395 外设设备:自研的DSP6678板卡 现象: MIC-3395单板机不能识别DSP6678板卡,但是在MIC-3392上能够正常识别,排查若干问题后,升级3395的 ...
- JavaScript高级程序设计学习笔记--面向对象的程序设计(二)-- 继承
相关文章: 面向对象的程序设计(一) — 创建对象 http://www.cnblogs.com/blackwood/archive/2013/04/24/3039523.html 继承 继承是OO语 ...
- Mysql-6-数据类型和运算符
1.mysql数据类型 (1)数值数据类型:包括整数类型tinyint.smallint.mediumint.int.bigint,浮点小数类型float和double,定点小数类型decimal. ...