"万恶的"指针
2013-11-18 22:10
375 查看
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 个字节。
一、从变量名处起,根据运算符优先级结合,一步一步分析.
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 个字节。
相关文章推荐
- "《算法导论》之‘队列’":队列的三种实现(静态数组、动态数组及指针)
- 万恶的"unrecognized selector sent to instance"颤抖吧
- 从"void*"到指向非"void"的指针的转换要求显式类型转换错误
- vs2015 点击cshtml 后提示 "无效指针" 的解决办法
- 万恶的指针
- "aa".equals(a)这种写法为什么就可以避免空指针。
- ADO方式连接数据库,出现"无效指针"错误,错误代码为:0x80004003
- PHP "gdImageCreateFromXpm()"空指针间接引用漏洞
- "《算法导论》之‘栈’":栈的三种实现(静态数组、动态数组及指针)
- "黑魔法"Method Swizzling和IMP指针
- 关于C语言的"[]"运算符与指针
- 关于百度地图SDK在" SDKInitializer.initialize(this);"初始化报空指针的问题
- dll应用,传说中的万恶的智能指针
- C++类指针在访问的时候何时用"->",何时候用"."
- 为什么多重继承中需要在"执行期"调整this指针
- Java使用"指针"快速比较字节
- 深入浅出 C语言指针 一
- 【C#】不安全代码中的指针用法
- 学习C语言_指针_6_指针变量的运算
- (原)C++智能指针——释放器(in linux, g++)