关于C指针用法的体会和感受

      提到C语言的灵活性,很容易就想到了指针,而指针也是让很多人迷惑不解的地方。指针的定义是一种用地址来访问计算机内存中存储的数值的方式,在C语言中指针是一种系统定义的类型,在C++的面向对象思想中,指针是一种对象。总之指针的本质是计算机中访问内存中数值的一种机制。指针的使用极大的提高了编程的灵活性的同时,也带来了内存管理上的很多麻烦。

关于C指针用法的体会和感受_第1张图片

                                                 图1:指针操作图

        在图1中,我们申明一个int类型的指针变量p,申明一个int变量b,赋予b的值为C,每一个变量本身占据一个存储单元,具有内存地址,我们把变量b的地址d 赋给指针p,这样p就指向了b,可以通过指针的方式,通过b的地址来访问b变量的值C。这就是一个最基本的通过指针来访问变量的例子。其中指针也具有类型,例如上面我们申明的是int型指针,就是告诉系统,指针p是用来指向一个int类型的变量,当我们通过指针定位到内存的某一块内存中,就可以正确的读取其中的数据。

        上面所述的基本指针用法,也被叫做一维指针,然而指针也是可以嵌套使用的,因此有了二维指针,多维指针。一般指针的嵌套使用到3维就够了,更多维的指针的使用会带来混乱,不仅不利于阅读,也不利于指针的管理。二维指针通俗的解释就是,指向指针的指针,在上述例子中,我们定义的p指针的类型是“指向int类型的指针”,p也有自己的地址,我们还可以在定义一个指针p2,让p2指向p1的内存单元。此时的定义方式是“int ** p2;”,这样我们就可以把p1指针的地址赋个p2,既而可以通过p2来两次解地址引用访问到变量b。这就是二维指针的用法,同理三维指针和更高维的指针,也是通过这种嵌套方式来增加间接引用的次数。

       另一个方面,指针的使用,与C语言中数组的使用紧密结合在一起,在C语言中一维数组的数组名,可以被看作是一个一维指针。例如定义一个一维数组:int array[10],此时数组名既可以通过下标访问某一个数据单元,如“array[5]”,也可以按照指针的方式,通过“ *(array+6)”这种方式来访问。我们还可以定义一个int类型的指针“int * p3=array”,然后把array直接赋值给p3,因为在数组的定义中,数组名就是表示的地址,因此我们在赋值的过程中,不需要再用取地址符号,对array取地址后再赋值给p3. 赋值后的指针p3可以看成与数组名一样,都可以通过两种方式,直接使用下标和指针的方式来访问数据单元。其实在编译器中,使用下标访问数据单元的方式,也是通过指针移位的方式来访问内存单元,这种方式访问数据能够带来更高的效率。

         因此二维指针,也就对应这二维数组,我们定义一个二维数组: int array2 [ 4 ][ 4 ].定义一个二维指针:int ** p4=array2;此时的二维指针已经指向了数组的首地址。在C语言中传递一个二维数组,最少应该给出二维数组中的第二维的长度,也就是每一行的数组元素个数,因为二维数组在存储上依然是按照一维来存储,只是通过映射的方式来让我看起来好像生成了一个二维数组,可以通过二维指标的方式来访问某一个数据单元,在底层,这些都是通过一个首地址指针和偏移量的计算,来范围存储在一维内存单元中的数据。在数组中我们知道array2 [ 2 ]是表示的第三行数据的首地址,相当于一维数组的地址,对应到指针的表示方法就是:  * (p4+2) ;就如array2[ 2 ]所表示的地址一样, * (p4+2) 表示的也是地址,并不能取得数组中存储的数据,二维指针必须经过两次解地址引用才能得到所指向的内存单元中的数据。如: *(* (p4+2) +2)就可以得到二维数组中的 array2[ 2 ][ 2 ]。同理三维数组和三维指针的对应关系也类似,一个三维指针第一次解地址引用,相当于成为了一个指向二维数组的指针,一个n维指针需要经过n次解地址引用,才能访问到所指向的数据单元中的数据。

       由于指针具有直接访问内存数据的能力,因此给编程带来了极大的方便。这也是C语言具有顽强生命力和高效的运行效率的一个很重原因。如果你看过一些底层的系统代码,例如linux内核的源代码,你会发现这些代码中,你可以很容易看见指针的身影。另一方面由于指针具有直接访问内存数据的权限,这也给系统带来了风险和指针管理上的麻烦,例如由于忘记释放不需要的指针,而带来的内存泄漏等问题。因此在更高级的语言如C++中,对指针的使用,就提供了标准的封装类库,使得指针的使用更加合理和安全。

        以下时一些程序中对指针用法测试的实例:

关于C指针用法的体会和感受_第2张图片关于C指针用法的体会和感受_第3张图片

      图2-1  指针基本用法示意图程序                                             图2-2 指针基本用法示意图程序运行结果 

关于C指针用法的体会和感受_第4张图片

                         图 3-1 三维指针和三维数组测试程序


                                                         图 3-2 三维指针和三维数组测试程序运行结果

如果你想在C语言中申请一个二维数组,它的每一维的空间大小都是你想设定的值,那么你可以采用动态申请数组的方式:


                       图 4-1 动态申请内存示例程序                                                                              图4-2 动态申请内存示例程序运行结果

       

你可能感兴趣的:(C语言,指针)