当前位置: 首页 > C, C/C++ > 正文

C指针小结2

                                                                                       C指针小结2

     在上一篇对指针的小结中只是片面的说明了指针的概况,与基本含义,其实说到指针必然要提及数组,数组与指针有着密不可分的联系。但是切记数组和指针根本是两个东西,指针不能和数组画等号。

    数组:

         例如 int a[10];这声明的是一个由10个整形组成的数组,其中包含10个整形元素,同时数组名的值是一个指针常量,也就是数组第一个元素的地址。如果前面声明的是其他类型那么,数组名的类型就是“指向其他类型的常量指针”。之前说过数组与指针不是一个东西,那么他们的区别在哪里?

       1.数组具有确定数量的元素,而指针是一个标量,只有当数组名在表达式中使用时,编译器才会为他们产生一个指针常量。

       2.数组名是一个指针常量,不能被修改,只有在两种场合下,数组名并不用指针常量来表示,就是当使用sizeof关键字和使用&运算符的时候,分别返回整个数组的长度和一个指向数组的指针。

       3.并且一般建立数组后都会给数组开辟实际存在的空间。

  数组内容的引用:

     众所周知想引用数组的内容一般有两种方法:

      1.下标引用

      2.间接引用

      除了[]的优先级比*高外没有什么区别。

       例如:

                a[3]    或者   *(a+3);

      关于指针引用和下标引用哪一个更有效率的问题:

毫无疑问指针引用的速度绝对比下标引用快,因为编译器在对下标处理时更费时间,当然只是指针引用的效率高而已,在现实实际的问题前面,指针不一定就更快了。因为频繁使用指针的代码必然看起来更复杂,可读性和下标法比起来较差。

     以下有几个小技巧:

      1.当你根据某个固定的数目的增量在一个数组移动时,指针更加便捷。

      2.声明为寄存器变量比静态存储变量效率更高。

      3.尽量少使用计数器

      4.在运行时出现&与sizeof将会付出很多时间与资源

指针数组:

        就是由指针组成的数组,即每一个数组内元素就是一个指针,这个应用在字符串应用尤其多。

        char *p[3]={

                         {“hello”},

                         {“Linux”},

                         {“DDD”},

                         };

      小结与提示:

                    1.请不要在一个未指定长度的数组的指针上执行指针运算。

                     2.只要有可能,函数的指针形参都应该声明为const

      关于字符指针变量和字符数组的讨论:

       例如:

    char *cp; 与char str[20];

                str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址

                 赋值方式:

                       str=”i love linux”错误,数组只能对元素赋值。

                       cp=”i love linux”正确

                       数组也可以在最开始赋值char str[30]=”i love linux”;

 现在总结下那些令人头疼的指针的声明: 

  ⑴  int  *p[3];                指针数组              

  ⑵  int   (*p)[3];             指向一维数组的指针

  ⑶  int  *p(int);              返回指针的函数

  ⑷  int  (*p)(int);            指向函数的指针(以一个整形为参数)返回一个整型变量

  ⑸  int  *(*p)(int);          返回一个指针的指向函数的指针

  ⑹  int(*p[3])(int);         函数指针数组,函数返回整型变量

  ⑺  int  *(*p[3])(int);     函数指针数组,函数返回整型指针


最后再来一个小例题:

                  用指针方式实现矩阵乘法:

                  例如

                          2   -6            4    -2    -4    -5             50     14   -44    -52

                          3    5     *                                  =     -23    -21    18     20

                          1   -1            -7    -3    6    7              11       1    -10    -12

           int   matrix_multiply(int  *m1, int   *m2,register  int *r,   int x,  int  y,int  z)

            {

                  register    int   *m1p;

                  register    int   *m2p;

                  register    int   k;

                  int  row;

                  int  column;

                  for(row=0;row

                    {

for(column=0;column

{

m1p=m1+row*y;

m2p=m2+column;

   *r=0;

                   for(k=0;k

       {

                                      *r+=*mlp* (*m2p);

m1p++;

m2p+=z;

}

                        r++;

                     }

             }

        }

           

              

              

版权声明:本文为博主原创文章,未经博主允许不得转载。

]]>

本文固定链接: http://zmrlinux.com/2015/04/01/c%e6%8c%87%e9%92%88%e5%b0%8f%e7%bb%932/ | Kernel & Me

该日志由 root 于2015年04月01日发表在 C, C/C++ 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: C指针小结2 | Kernel & Me
【上一篇】
【下一篇】