浅要总结C中指针

重新学了一遍C,不过这次更为细心,因为得留意、得去思考,如此得到的才是自己的东西,所以总结就显得很必要了。

指针是一种特殊的数据类型,它存储的是一个变量或者函数的地址值。笼统的说,每个变量及函数都有其对应的地址(寄存器变量及内联函数除外),所以对每个变量及函数的访问可以通过指针来实现。指针也就因此显得很强大!!

  我觉得学C时可将其对指针的使用分两个层次,一个是低层次的使用,一个是高层次的使用。低层次的使用指的是对一些基本的数据变量进行访问,其代表性的使用体现在对数组的应用上。高层次的使用指的是通过指针对函数进行操作。所以自己这次进行浅要总结的一些内容无外乎这两方面了,因为对函数指针还没有使用过,所以也就略微带过。

  如下结构展开:

                          |-----一

          |-----访问数组数据

          |               |-----多维

       数组------函数处理

       |  |

       |  |-----const应用

指针——|

       |

       |

       函数------函数指针的应用

    

    因为C中的强变量类型,多以每个变量及函数都需要有其对应的类型,所以指针在使用的过程中也是需要进行类型指定的。这里为了好理解这样称指针具有类型,实际上只是表示指针所指向的类型。

1】数组与指针。

     简单运用——访问数组成员

A:  double ptrA;  

              double arrA[5];

       例B:  double ptrB;

  double (*ptrBMul) [5]

     double arrB[5][5];

基本语法告诉我们:一个数组的数组名就是其数组的起始地址地址这里需要强调。所以可以这样用一个指向相应数据类型指针指向这个数组:

上例AptrA = arrA 或者 ptrA = &arrA[0];

上例BptrBMul = arrB 或者 ptrBMul = &arrB[0];

       Sorry! You can not use like this:

       ptrB = arrB 或者 ptrB = &arrB[0];

     因为ptrB是一个指向单个double数据的指针,而arrB此时是一个多维数组,它的数组名是表示arrB[5]这个数组的首地址,而arrB[5]中的每个元素实际上又可以看成是一个新的数组,所以这里数组名已经不再表示这个数组首元素的地址,而是这个数组首元素地址的地址。即 arrB[0][0] = * * arr(指针的指针).

多频率运用——函数中的参数

       例 Adouble arr[5][5];

            void disp(double arr[][5]);  或者

void disp(double (*)[5]) ;

      B: double arr[5][5];

            void disp(double arr[],int c);  

void disp(double *,int c);

 void disp(double arr[][5],int rows)

void disp(double (*)[5],int rows]);

实际情况告诉我们,我们通常要使用一些必要的函数来对数组进行处理,这里有两点需要自我提醒,一是在对多维数组进行处理时,形式参数的声明。二是在得注意在使用数组处理函数中传递这个数组的一些相关数组大小的参数是必要的。

详细说明:一,函数声明中,因为要指明数据的类型,因此在指定多维数组的形式参量的时候,得注意,如例A,此时是对一个5*5的数组操作,只有在通过这样指定后才能通过disp(arr)这样进行调用,因为arr这时的类型和声明中的一样,为指向五个double 元素的数组的指针。二,因为在传递过来的参数中,它仅是一个地址,所以你不能对它进行一些在定义此数组的函数中完全的操作,如sizeof(arr).这在定义它的函数中,可以返回数组arr的存储空间大小,而在调用的函数中如此使用只会得到存储这个指针空间的大小。一个解决方案就是利用其他参数传递有关数组大小的值。

  

  施加const

 例 A: const double arr[5] = {1.1,2.2,3.3,4.4,5.5};

       例 B: double * const ptr = arr;

       例 C: const double * const ptr = arr;

     例A中表示,这个里面的内容不能允许通过arr进行修改,所以在函数中这样声明:

Void disp(const double arr[],int c);这样函数disp不能改变传递过来的数组的元素,可以达到保护原数组的目的。

 例B中的初始化可以让指针变量只指向arr

 例C中的指针ptr即不可以更改所指向的地址,也不可以更改所指向的数据。

     有一点需要说明的是:常量或非常量的地址可以赋值给常量的指针;而常量的地址不能够复制给非常量指针。Const double ptr即为一个常量指针。就是指的所指向的内容是常量。

【2函数与指针。

    函数指针的运用应是C中一大重点,同时也是难点。因为在C学习的过程中一个函数的知识块我们要学很久,而一个指针的知识块我们同样要学N久。还有言曰:“C的精华就是指针!”。由此可见这个函数与指针的结合——函数的指针是很重要的!而课堂中的老师也说过学C的只有接触到函数指针的时候才算得是真正入了C的大门。

看完了这本C教程,里面讲到的关于函数的内容也只是略微提及的,看来这函数的指针已是一大精华早已经化为罡气,在各种高级应用中起着作用。不过自己还没有学到,这里也是总结一下学到的概念。下一步学习老师们推荐的Windows 什么API编程,高级编程的时候碰到了再说吧。

 例:

  Main()

 {

Void disp(char *);

    Void (*ptrF) (char *);

    Char str = Attention, Ladies and gentlemen!;

 

   ptrF = disp;

    (*ptrF)(str);

    ptrF(str);

 }

 Void disp(char arr[])

     Ptintf(%s/n,arr);

}

同理,指针时有类型的,函数的指针当然同样不能例外。如上例,函数是具有char *类型的参量,返回类型是void的函数。那么指针ptrF的类型就是void (char *)它是指向“具有char *类型的参量,返回类型是void的函数”的指针。(指针类型的定义已经在开头说明过了~

如何调用上面的例子已经给出。(*ptrF)(str);ptrF(str);这两种用法都是可以的。还是前一种用法好理解些啦!

  

   OK,今天的总结就写到这里吧。

2009.7.13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值