"万恶的"指针

来源:互联网 发布: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 个字节。