忘记悲伤最好的办法可能就是让自己有事做吧。 因为工作需要,很多好朋友都在重新补最基础也是最重要的C语言。人常说没有学好指针就等于没有学过C,在学校时可能老师只是为了应付考试,而一直在讲那些死板的语法。但对这个C语言(也是任何编程思想)的精髓没有重视。
确实,在几年的编程过程中,感觉对指针的精通可以让我们对任何语言都触类旁通了。语言只是方便我们表达自己思想的助记符,真正的程序在内存中是如何运行的?理解指针可以让你更清楚的知道。
最近在网上看了一些讲解指针的文章,从这些文章中将自己对指针的了解加以整理,我认为基本上如果可以真正理解下面这些,那么你可以对别人说你对C的思想已经精通了。完全精通一门语言当然还要知道它常用的库函数,当然那些就要你自己多编,多记了。
/*--------------------------------概念------------------------------------------*/
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:
[1]指针的类型,
[2]指针所指向的类型,
[3]指针的值或者叫指针所指向的内存区,
[4]还有指针本身所占据的内存区。 --sizeof(指针变量名) 一般32位机都为4;
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。
[1]指针的类型: (指针本身在内存中的样子,类型)
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。
[用途]在指针的赋值运算时,知道了指针的类型就可以来定右值得类型了;
[2]指针所指向的类型:(指针所指向的内存块里应存的是什么样子(类型)的东东)
当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。
[3]指针的值或者叫指针所指向的内存区:
指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。
[小结]
例:
int(*ptr)[3];
//指针的类型是int(*)[3] -- 一个数组指针,它相当于行指针,它所指的都是一个int()[3]--一维数组;
//指针所指向的的类型是int()[3] -- 这个就是这个指针所指的内存中应存的东西的类型,及一维数组;
指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在上面,指针所指向的类型已经有了(声明了),但由于指针还未初始化(未定义,未初始化),所以它所指向的内存区是不存在的,或者说是无意义的。
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
注意不知道指针指向哪里就开始用是很危险及隐蔽的错误!!!
-------------------------------------实例分析----------------------------------
例四:
1、chara[20];
2、int*ptr=a;
...
...
3、ptr+=5;
在这个例子中,ptr被加上了5