• c语言中双维数组与指针的那点事儿


    说起c语言的指针,估计对c语言只是一知半解的同志们可能都会很头疼,尤其它跟数组又无耻的联系到一起的时候,就更加淫荡了!!!

    怎么说呢,就是有一点规定:(或准则)

           数组名可以看成是指向数组头元素的指针,对,只是能看成。但,数组名,不是指针(不能相互赋值)。不过,可以当指针用。但是,指针不可以当数组名用。

    在c语言的始祖书籍《K&R》中,有这么一段声明:只有在作为函数形参的时候

                                                                     int a[];

                                                                     int *a;   具有相同的意义。 这个必须要理解。   

    例如: char str[]="abc";

              str[0]='d'; -----可写

            

              char *str="abc";

              str[0]='d';-----一般会报错

    然后,重点理解下二维数组与指针的关系(注:没有二维数组这么个东西,标准叫法是数组的数组)

    代码:

    #include<stdio.h>
    
    int main()
    
    {
    
     char* color[]={   "red",   "green",   "blue"  };  
    
    char colors[][6]={   "red",   "green",   "blue"  };
    
     printf("%p\n",color);
    
     printf("%p\n",*color+1);  
    
    printf("%p\n",*color+2);
    
     printf("%s\n",*color);
    
     printf("%s\n",color[0]);
    
     printf("%c\n",color[0][0]);
    
     printf("%c\n",*(*color+1));
    
     printf("%c\n",(*color)[2]);
    
     printf("%c\n",*color[2]);
    
     printf("%c\n",*&(*(color+1))[4]);//jiu zhe me xiao zhang
    
     printf("%c\n",*(*(color+1)+4));
    
     printf("%d\n",&(*(color+1))[4]);
    
     printf("%c\n",**color);
    
     printf("数组的数组\n");  printf("%s\n",*color);
    
     printf("%c\n",**(colors+1));
    
     printf("%s\n",color[0]);
    
     printf("%c\n",colors[0][0]);
    
     printf("字符串\n");  char* str="abc";
    
     printf("%c\n",*str);
    
     printf("%c\n",*str+2);
    
     printf("%c\n",*(str+1));
    
     printf("%s,%d\n",colors[0],sizeof(colors[0]));  
    
    return 0;
    
    }

    逐个分析:

    color是指向第一个数组的头一个元素的指针,也是数组名,第一个数组实际是color[3][5].

    那么 *color   就是red 了,color指向red,加个*号,表示解引用,打印真实对象值;

             color[0]  很明显,就是第一个元素,也是red;

            color[0][0]  第一个元素red的第一个元素 ,即r;

            **color  与上一个等价,*color是"red",而字符串又是char的数组,所以,就相当于*color又是char[]数组的指针了,再加一个*,解引用,就成r了;

                      char[]={'r','e','d','\0'}

    同理   *(*color+1) ,就是第二个字母e了;

    因为  *color就是"red"嘛,*color就相当于char[]的数组名了呗,那么(*color)[1],也就表示该char[]数组的第二个字母了,即e;

    注意,我说的char[]数组就是char[]={'r','e','d','\0'},通篇公用哈~

    再来区别一下:

              (*color)[1]   输出e,即red里面的e

              *color[1]     输出g,即green的g;

    因为  *color  整体代表一个数组名

            但由于这种表达式是从右向左结合的,所以如果没有(),则首先会生成color[1],即字符串"green",而字符串"green"也可以看成是char[]数组,所以color[1],这时候还有一个角色就是char[]={'g','r','e','e','n','\0'}的数组名了,所以,再加个*,自然输出的就是g了。

         同理:

                 (*(color+1))[4]

                  *(*(color+1)+4)等价。

    再看看colors数组,它的声明中没有出现*号,那么它该怎么与*联系呢?当然,只有一条:数组名可以看成是指向数组第一个元素的指针。

    比如:  colors[0]

               *colors  等价,colors可以看成是指向"red"的指针,加*号解引用。

    比如:  colors[1][0] 

               **(colors+1) 等价,其中,*(colors+1)是"green"  ,再加*号,表示"green"的第一个元素,即g。

    程序运行的截图:

    欢迎讨论~~

  • 相关阅读:
    SQL联合更新
    Service Oriented Architecture and WCF
    ubuntu10.4 中安装中文输入法
    QT WINDOWS QTCreator
    QImage,QPixmap,QBitmap,QPicture
    一、Qt Creator的安装和hello world程序的编写
    解决ubuntu打开windows下保存的txt文件中文乱码问题
    Windows+QT+Eclipse+MinGW搭建QT开发环境详细教程
    虚拟机VMware Workstation v6.5官方正式版+汉化补丁+算号器(附安装及使用图解教程)(转)
    决定你是穷人还是富人的12条
  • 原文地址:https://www.cnblogs.com/dftencent/p/3306698.html
Copyright © 2020-2023  润新知