该系列文章源于《深入理解C指针》的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教。  

  C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是受到几乎所有程序员的肯定。C语言的这种灵活性很大一部分程度来源与C指针,指针为C语言动态操控内存提供了支持,同时也便于访问硬件。由于编程的本质就是操控数据,而数据大多都在内存中,理解C管理内存的工作原理,就显得尤为重要了。知道malloc()函数能够从堆上申请内存,理解内存分配的本质则是另外的事。

  C语言中掌握指针的意义:

    1、撰写快速高效的代码

    2、方便解决问题的途径

    3、支持内存灵活的分配

    4、使得表达异常的简洁

    5、减少传递数据的开销

    6、保护函数传递的数据

    7、实现函数强大的回调

    8、拥有数据万能的结合

  C语言中指针的用途:

    1、动态操控内存:2章、 3.1章

    2、灵活数据传输:3.2章、

    3、方便数据转型:类型定义、指针转换

    4、统一数据存储:系统层面、内存组织

    5、实现硬件访问:8.1章、 8.2章

    6、强化数据结构:3.3章、 4章、 5章、 6章、 8.3章、 8.4章

  编程的本质是操控数据,包括数组的组织和数据的操作,除了特殊的算法外,算法也是操作数据的范畴。数据操作需要计算机中CPU和内存的介入,CPU主要完成数据的计算:算术运算、逻辑运算、浮点运算,包括数据的传递方向和传递时机等。

  指针:存放有内存地址的变量;

  理解C指针:理解C语言组织内存方式(静);理解C程序管理内存方式(动);必须理解C语言的内存模型

  C语言内存模型:操作系统(类型和架构)和编译器(厂商和版本)  

  变量和内存:变量做为计算中内存地址的别称,主要是给人看的;变量的三要素:类型和值  

  请看代码例子:  

  #include <stdio.h>
#include <stdlib.h>
#include <string.h> int main(int argc, char **argv)
{
typedef struct student{
char name[];
char class[];
char sex[];
int age;
//char zhu
} Student; Student stu;
strcpy(stu.name, "zhangsan");
strcpy(stu.class, "A1411");
strcpy(stu.sex, "na");
//stu.zhu = 'n';
stu.age = ; printf("The stu information: \n");
printf("Name:\t%s;\n", stu.name);
printf("Class:\t%s;\n", stu.class);
printf("Sex:\t%s;\n", stu.sex);
printf("Age:\t%d;\n", stu.age);
//printf("Zhu:\t%c;\n", stu.zhu); printf("The struct stu'size is %d\n", sizeof(Student)); return ;
}

  保留12、19、27行的代码的执行结果:

  The stu information:
  Name:   zhangsan;
  Class:  A1411;
  Sex:    na;
  Age:    19;
  Zhu:    n;
  The struct stu'size is 28
  其中12行代码和11行代码交换后执行结果:

  The stu information:
  Name:   zhangsan;
  Class:  A1411;
  Sex:    na;
  Age:    19;
  Zhu:    n;
  The struct stu'size is 24

  注释12、19、27行的代码的执行结果
  The stu information:
  Name:   zhangsan;
  Class:  A1411;
  Sex:    na;
  Age:    19;
  The struct stu'size is 24

  唯一的区别就是在结构体中增加了一个char型字符,但是结构体的大小增加了四个。

  这个例子充分说明想学好C语言,必须搞定C语言中计算机的内存分配的原理和机制,否则C语言总是一知半解的。

最新文章

  1. MongoDB学习笔记—Linux下搭建MongoDB环境
  2. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
  3. Nodejs爬虫进阶=&gt;异步并发控制
  4. 使用React重构百度新闻webapp前端
  5. 如何获取有性能问题的SQL
  6. 在ASP.NET中上传附件
  7. winform 记录全局异常捕获
  8. 回顾JDBC
  9. 成都Uber优步司机奖励政策(2月21日)
  10. onTextChanged参数解释及实现EditText字数监听
  11. SolrCloud阶段总结
  12. (转载博文)MFC 窗口句柄获取
  13. Apache服务器学习笔记
  14. OC-之NSDate、万年历
  15. 论C++如何优雅的使用数组
  16. 001 Nibiru SDK 调试工具介绍
  17. MongoDB 提升性能的18原则(开发设计阶段)
  18. 【Android】pidcat 不显示日志输出
  19. FirewallD 快速使用文档
  20. Github使用笔记——创建远程库

热门文章

  1. 常见react面试题汇总
  2. PHP 计算代码运行所占内存和时间
  3. 【java】A local class access to local variables
  4. JZOJ 3388. 【NOIP2013模拟】绿豆蛙的归宿
  5. stm32串口——标志位学习
  6. 实验一 查看CPU和内存,用机器指令和汇编指令编程
  7. sql中比较大小
  8. vrpie下实现vrp模型和javascript的交互
  9. 实时视频h5
  10. 【Pow(x,n)】