C语言编程主要操作的对象就是指针

指针从哪里来

指针就是表示内存存储区域的一组数值,使用%p格式化字符串。

Linux系统会为程序维护两个临时变量存储位置:栈、堆。栈的空间少,栈通常在用户更高的地址空间处分配,通常有数M字节的大小,堆一般比栈要更大一点,一般会达到几十甚至是数百M字节。

对于较小的变量,使用int、char、double等定义符号,可以直接在栈中建立空间。

#include <stdio.h>

int main(){
int a = -1;
int b[4] = {0, 1, 2, 3};
int c = 4; printf("id(a):%p\n", &a);
printf("id(b[0]):%p\nid(b[3]):%p\n", &b[0], &b[3]);
printf("id(c):%p\n", &c); int* d = &b[4];
printf("id(d[0]):%p\nid(d[3]):%p",&d[0], &d[3]); return 0;
}

函数退出时C编译器会从栈中“弹出”所有变量,清空整个栈,因此防止了栈上变量的内存泄漏。

值得注意的是,如果获取了指向栈上变量的指针,并且将它用于传参或从函数返回,接收它的函数会产生“段错误”。因为实际的数据被弹出而消失,指针依旧指向被释放的栈区域。

栈容量有限,很容易溢出,因此对于较大的数据结构,比如结构体,尽可能在堆上开辟空间。

malloc、calloc等初始化函数就是Linux为程序进程开辟堆内存空间的函数。这些初始化动作返回的指针,都是指向目标内存区域的起始位置。

一块内存空间一旦使用完毕,应该立即调用free函数释放空间。否则,函数退出后,指针变量在栈上随即被注销。但是指针所指向的内存空间仍然在系统注册为“正在使用”。这就造成了,系统无法再度分配该空间,而进程也没有指针操纵该空间,就成了内存泄漏

使用free释放内存空间之后,该指针仍然会指向原来的地址,成了“野指针”,容易造成危险。为了避免,这种情况的发生,应该在调用free之后,立即将指针置为NULL。

指针有什么用

指针可以用于四个最基本的操作:

  • 向OS申请一块内存,并且用指针处理它。这包括字符串、结构体等等。
  • 通过指针向函数传递大块的内存(比如很大的结构体),这样不必把全部数据都传递进去。
  • 获取函数的地址用于动态调用,可以向其他函数传递函数指针,从而实现callback回调机制。
  • 对一块内存做复杂的搜索,比如,转换网络套接字中的字节,或者解析文件。

指针的使用

  • type *ptr,type类型的指针,名为ptr。
  • *ptr,指针ptr所指向位置的值。
  • *(ptr + i),(ptr所指向位置加上i)的值。以字节为单位的话,应该是ptr所指向的位置再加上sizeof(type) * i。
  • &thing,变量thing的地址。
  • type *ptr = &thing,type类型的名为ptr的指针,其值设置为thing的地址,也就是“新建一个指向thing的指针,thing的类型是type”。
  • ptr++,自增ptr指向的位置,相当于*(ptr + 1)

指针和数组

指针并不是数组,即使C允许以一些相同的方法来使用它们。例如,对于一个数组age[]的指针cur_age,调用sizeof(cur_age)会得到指针的大小,而不是它指向数组的大小。如果想得到整个数组的大小,应该使用数组的名称age。

除了sizeof、&操作和声明之外,数组名称都会被编译器推导为指向其首个元素的指针。对于这些情况,不要用“是”这个词,而是要用“推导”。

参考资料

延伸阅读

《笨办法学C》笔记之指针的更多相关文章

  1. [IT学习]Learn Python the Hard Way (Using Python 3)笨办法学Python3版本

    黑客余弦先生在知道创宇的知道创宇研发技能表v3.1中提到了入门Python的一本好书<Learn Python the Hard Way(英文版链接)>.其中的代码全部是2.7版本. 如果 ...

  2. 笨办法学 Python (Learn Python The Hard Way)

    最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注 ...

  3. 笨办法学 Python (第三版)(转载)

    笨办法学 Python (第三版) 原文地址:http://blog.sina.com.cn/s/blog_72b8298001019xg8.html   摘自https://learn-python ...

  4. 笨办法学Python - 习题1: A Good First Program

    在windows上安装完Python环境后,开始按照<笨办法学Python>书上介绍的章节进行练习. 习题 1: 第一个程序 第一天主要是介绍了Python中输出函数print的使用方法, ...

  5. 笨办法学python 13题:pycharm 运行

    笨办法学python 13题 代码: # -*- coding: utf-8 -*- from sys import argv # argv--argument variable 参数变量 scrip ...

  6. 笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘

    笨办法学python - 专业程序员的养成完整版PDF免费下载_百度云盘 提取码:xaln  怎样阅读本书 由于本书结构独特,你必须在学习时遵守几条规则 录入所有代码,禁止复制粘贴 一字不差地录入代码 ...

  7. 笨办法学Python 3|百度网盘免费下载|新手基础入门书籍

    点击下方即可百度网盘免费提取 百度网盘免费下载:笨办法学Python 3 提取码:to27 内容简介: 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用. ...

  8. 《笨办法学 Python(第四版)》高清PDF|百度网盘免费下载|Python编程

    <笨办法学 Python(第四版)>高清PDF|百度网盘免费下载|Python编程 提取码:jcl8 笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机 ...

  9. 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  10. 《笨办法学Python 3》python入门书籍推荐|附下载方式

    <笨办法学Python 3>python入门书籍免费下载 内容简介 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用.这本书以习题的方式引导读 ...

随机推荐

  1. java 平台 权限管理

    最近在做公司内部的物流业务平台的权限管理,感触颇多.记录一下 权限管理分两部分:数据权限和操作权限. 数据权限: 这个是和用户相关的. 因为平台是多机构的,所以再考虑数据权限的时候,是按照机构来管理的 ...

  2. Java上面出现这个错误如何解决关于XML的

    Java上面出现这个错误如何解决关于XML的 2015-01-07 14:49 hejiashun11325 | 分类:JAVA相关 | 浏览265次 The type org.xmlpull.v1. ...

  3. thinkPHP-空操作

    空操作 当访问的方法不存在时,可以定义一个empty方法来避免空操作 function _empty() { echo "网页不存在,请检查地址信息"; } 这样当访问不存在的方法 ...

  4. 我个人结合到老师的来理解的——Asp.net Webform的页面生命周期

    1.分析请求的资源路径,寻找目录中对应的资源文件,若无法找到资源文件,则返回404错误2.分析资源文件的Page命令,通过Page指令找到代码文件和类 3.将页面文件和类一起编译生成最终的类(仅仅在第 ...

  5. Codeigniter

    最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路.用在公众的项目,最好还是按框架规范来,所以还是总结一下,免得以后别人再 ...

  6. JAVA反射实践

    Java反射机制在我的理解当中就是下面几点: 1. 对一个给定的类名(以字符串形式提供)能动态构建一个对象实例 2. 对于任意一个类,都能够知道这个类的所有属性和方法     3. 对于任意一个对象, ...

  7. Redis从基础命令到实战之有序集合类型(SortedSet)

    有序集合类型是Redis五种数据类型中最高级的.也是最复杂的类型.有序集合具有集合类型的特性,在其基础上给每个元素关联了一个分值,或称为权重,操作时既可以在添加元素时指定分值,也可以单独修改集合中某一 ...

  8. app跳转openURL,兼容方法

    - (void)openScheme:(NSString *)scheme {   UIApplication *application = [UIApplication sharedApplicat ...

  9. Struts2 的 值栈和ActionContext

    1.ValueStack 和 ActionContext 的关系与区别: -- 相同点:它们都是在一次HTTP请求的范围内使用的,它们的生命周期都是一次请求 -- 不同点:ValueStack 分为对 ...

  10. 用JS做的时钟

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...