C语言数组与指针详解

galoisgodel 2012-02-04

好多同学都说:“老师,我看到指针就晕!”,说实话,见过晕血的,见过晕车的,晕指针的到是第一次听说!

       我们先来分析一下晕车的原理,再来对比一下为什么晕指针。

       晕车,是因为耳朵里的一个器官对外界的振动太敏感,导致身体调节功能紊乱,系统不能正常工作,轻则,晕点,中则,吐点,重则,“重启”(倒地)。时间长了,知道自己晕车,于是,看到公交车,TAXI,火车,自行车,都晕!这样的病就大了,上升到心理疾病了。这可得治。我们都明白上面的道理,怎么克服晕车呢?你不可能避免做车,你要去面对,怎么克服晕车也很简单,先是功心,“口服不如心服”,所以先治心病:建立信心。经常试着去做晃动不大的车,最好听着MP3,这样能减缓心理对晕车的敏感度。时间长了,慢慢的克服了心理作用,然后就要上升到治根的阶段了,要去试着挑战做公交,TAXI,船。

       上面都是个人的一些见解,上大学时,要是不学计算机就去学医了!

       回来我们开始治“晕指针”这号病,其实很多同学晕指针,也是因为自己基础不好(身体素质不好),刚开始学的时候,不用心,还没有弄的很明白,一编程(有的同学4年都没编过一个程序)就错,形成了恐惧心理,其实C指针非常灵活,它对学生的要求也比较高,说白了,它要求有计算机的组成原理一些基础,如果有的话,你回头看指针,So easy!

       我们先开始“攻心”。

 

1.         晕指针,唐式偏方一:“投石问路”

#include <stdio.h>

int main(void)

{

       char* str = "ABCDEFGHIJKL";

       int* pInt = (int*)str;

       printf("%c\n%c\n",*(str+1),*(char *)(pInt+1));

       return 0;

}

       上面的程序如果你要是灰常EASY的回答出来,那你的功底已经不错了!心病是估计没有了,可以进入吃药保养阶段了(做题)。

如果上面的题看起来就特别费劲,看来你晕的不轻,得治。要不问题会很严重。

 

基于上面的小测试,进入唐式第二方:“理气静心”

       我们先看把C指针的基础打好。在这之前先来复习下变量和常量,有的同学会问,这是为什么,我只能告诉你,你晕C指针,是因为你从刚开始有问题就没有重视,或者你忽略了问题的严重性,导致现在的情况,这也没有办法,中国的教育就不重视这一块,说实话,大学里讲C语言的,很多都没有太多的讲到变量和常量,这是很XXX的。我们开始治疗。

 

  •  常量:其值不发生改变的量称谓常量。常量又称为字面量,表述常数。它们可以和数据类型结合起来分类,比如:整形常量,浮点型常量,字符常量= =,常量是可以不经过定义和初始化,而直接引用的

常量又分为:直接常量和符号常量。

直接常量又叫做:字面常量。如12,0,4.6,‘a‘,“abcd”

符号常量如宏定义的:#define PI 3.14

特点:常量的值在其作用域内不会发生改变,也不能再被赋值。其在出现时就被当作一个立即数来使用。也就是说,只能被访问,被读,而不能被写,被赋值。

 

  •  变量:其值可以改变的量称这变量。一个变量应该有一个名字,在内存中占据一定的存储单元。变量在使用前必须要定义

 

  •  变量名和变量的值:

变量名是在,变量的声明的时候,该名字就和内存中一块地址绑定在一起了。可以通过变量名直接找到对应的内存区域,也可以通过地址找到其内存区域。因此有了引入指针的依据。

变量的值是变量所对应的内存区域内存放的二进制序列。当该变量被声明成整形时,内存区域的二进制序列被以整形的形式翻译出来。比如:int a = 97; 其在内存中是以97的二进制形式存放的,当使用时,他会被以10进制形式表现出来。同样的char a = ‘a’; a的ASIIC码是97,也是以97的二进制存放的,使用时,会被以字符a的形式表现出来。

如果变量是一个指针变量,那么指针变量里的二进制序列被翻译成一个地址,

比如:

       int a = 10;

       int * p;

       p = &a;

这里的指针变量p的值是a的地址(p = &a),它是什么啊?看下图:

C语言数组与指针详解

声明了一个变量a,它是整型,被赋值为10(它的值被翻译成整数),要形成这种思维,时间长了你就知道这样做的好处了,又声明了一个指针变量p,它是Int类型的(它指向的地址里面要装Int),然后将a变量的地址(ox2c406b24)给了p,这儿注意下。现在访问a里面的值有了两种方式(其实本来也有这两种),一个是通过变量名a(绑定的),一个是通过地址ox2c406b24,地址ox2c406b24给了p了,p指针变量(指针变量是变量,这个思维很重要)里面存放的是ox2c406b24(a的地址),那么现在访问a可以通过:

       printf("%d\n", a);    //通过变量名

       printf("%d\n", *p);    //通过指针变量

相关推荐