00深入理解C指针之--- 指针之外
该系列文章源于《深入理解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语言总是一知半解的。
最新文章
- MongoDB学习笔记—Linux下搭建MongoDB环境
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
- Nodejs爬虫进阶=>;异步并发控制
- 使用React重构百度新闻webapp前端
- 如何获取有性能问题的SQL
- 在ASP.NET中上传附件
- winform 记录全局异常捕获
- 回顾JDBC
- 成都Uber优步司机奖励政策(2月21日)
- onTextChanged参数解释及实现EditText字数监听
- SolrCloud阶段总结
- (转载博文)MFC 窗口句柄获取
- Apache服务器学习笔记
- OC-之NSDate、万年历
- 论C++如何优雅的使用数组
- 001 Nibiru SDK 调试工具介绍
- MongoDB 提升性能的18原则(开发设计阶段)
- 【Android】pidcat 不显示日志输出
- FirewallD 快速使用文档
- Github使用笔记——创建远程库