"万恶的"指针
来源:互联网 发布:jsquery 数组加数据 编辑:程序博客网 时间:2024/06/08 04:03
C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。回想两年前当初学习C语言的情形,我们用的是非常基础的谭浩强写的《C程序设计》(第三版),当时由于课程时间不够,老师到最后快期末了,才讲到结构体,没办法,最后老师一节课给我们讲了结构体、指针、链表、文件操作。当时就觉得这些非常难,也看不懂,并且期末还没有考这些,使得我以为这些东没用。后来当我踏入技术人员的行列,才发现学校害我们真的不浅,后面的这些是后续深入开发必备的,其中指针更是核心中的核心,我从搞嵌入式开始,从接触Uboot、linux内核,到后来的深入学习计算机系统、编程思想等,都深深感觉,操作系统、内核这些东西就是指针、结构体、链表、数组的统一结合体,并且都是非常深入的调用,所以我后来下定决定好好搞一下这些东西。今天和大家分享一下比较重要的东西--------“万恶的”指针。(发表时间仓促,如果有误,希望各位不吝赐教,谢谢!)
一、从变量名处起,根据运算符优先级结合,一步一步分析.
int p 普通的整型变量。
int *p p先与*结合,则p是一个指针,然后与int结合,那么p就是一个指向整型数据的指针。
int p[3] p先与[]结合,则p是一个数组,然后与int结合,那么p就是一个含有三个整型数值的数组。
int *p[3] p先与[]结合,则p是一个数组,然后与*结合,那么p就是含有三个指针的数组,再与最外层的int结合,那么p就是含有三个整型指针的数组。
int (*p)[3] p先与*结合,则p是一个指针,再与[]结合,那么p是一个指向含有三个数据数组的指针,最后与int结合,那么p就是指向含有三个整型数值的数组。
int **p p先与*结合,则p是一个指针,然后再与*结合,那么p是一个指向指针的指针,那么p就是指向,指向整型数据指针的指针。
int p(int) p先与()结合,则p是一个含有一个整型参数的函数,再与int结合,那么p就是带有一个整型参数,返回整型的函数。
int (*p)(int) p先与*结合,则p是一个指针,再与()结合,那么p就是一个指向含有一个整型参数函数的指针,最后与int结合,那么p就是一个指向一个带有一个整型参数,返回整型数值的函数的指针。
int *(*p(int))[3] p先与()结合,则p是一个含有一个整型参数的函数,再与*结合,那么p就是一个指向含有一个整型参数函数的指针,再与[]结合,那么p就是一个指向三个含有一个整型参数函数数组的指针,最后于*结合,那么p就是一个指向三个含有一个整型参数函数指针数组的指针(简单地说,就是p指向一个由三个函数指针组成的数组)。
二、指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,指针本身所占据的内存区。
一般而言,无论指针是什么类型、指向什么,指针变量本身在内存中所占据的空间都是4字节,而指针所指向的存储空间,则视不同的计算机位数而言,32位,则指向的存储空间就是32字节,64位,则指向的存储空间就是64字节。指针可以加上或减去一个整数。
指针的这种运算的意义和通常的数值的加减,运算的意义是不一样的,以单元为单位。
例如:
char a[20]="You_are_a_girl";
int *ptr=(int *)a;
ptr+=5;
在这个例子中,ptr 被加上了5,编译器是这样处理的:将指针ptr 的值加上5 乘sizeof(int),在32 位程序中就是加上了5 乘4=20。由于地址的单位是字节,故现在的ptr 所指向的地址比起加5 后的ptr 所指向的地址来说,向高地址方向移动了20 个字节。
- 万恶的指针
- "万恶的"指针
- 万恶的void*指针类型转换
- dll应用,传说中的万恶的智能指针
- 万恶的Makefile,万恶的记事本。
- 万恶的BOM,万恶的微软
- 万恶的食堂
- 万恶的百度竞价排名
- 万恶的javabean
- 万恶的双休
- 万恶的押宝游戏~
- 万恶的STL错误
- 万恶的IIS+ASP
- 万恶的DM
- 万恶的C语言
- 万恶的夏令时
- 万恶的android API
- 万恶的SimpleDateFormat
- 使用Stellarium查看彗星
- 你拒绝的,也许是改变你最佳的机会
- C++的string类
- linux下修改IP
- 关于编译原理词法分析程序的设计(VC实现)
- "万恶的"指针
- Win32多线程之GetExitCodeThread
- Python 笔记
- 监听总结之1.“正在连接到”后面跟着的内容受哪些因素影响(同名不同配置)
- so cute are you python 18
- error C2628: followed by 'char' is illegal (did you forget a ';'?)
- 如何在PCB设计中增强防静电ESD功能
- 事件从Activity到布局view再到最终组件的传递过程
- PCB设计技巧与注意事项