zoukankan      html  css  js  c++  java
  • C语言指针学习(续)

    五、数组和指针的关系

    int array[10] = {0,1,2,3,4,5,6,7,8,9},value;
    ...
    ...
    value = array[0];//也可以写成 value = *array;
    
    value = array[3];//也可以写成 value = *(array+3);
    
    value = array[4];//也可以写成 value = *(array+4);
    

      上例中,一般而言,数组名array代表数组本身,类型是int[10];如果把array看作指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型 int ,因此*array = 0 就一点也不奇怪了。同理,(array+3)指向数组单元的第三个指针,所以*(array+3) = 3 ;

      

    char *str[3] = {
    "Hellp,this is a sample",
    "Hi ,good morning ",
    "Hello world"
    };
    
    char s[80];
    strcpy(s,str[0]);//也可以写成 strcpy(s,*str);
    strcpy(s,str[1]);//也可以写成strcpy(s,*(str+1));
    

      上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针每个都指向一个字符串,如果把数组名看作指针的话,它指向数组的第0号元素,类型是char** ,指向的类型是 char *;

    *str 也是一个指针,它的类型是char*,指向的类型是char ,它指向的地址是字符串 “Hello,this is a sample”的第一个字符H的地址。*(str+1)也是一个指针,他的类型是char*,指向的类型是char,指向“Hi,good morning”的第一个字符H的地址。

      在不同的表达式中,数组名array可以扮演不同的角色 。在表达式sizeof(array)数组名array 代表数组本身,故测出的是整个数组的大小。在表达式*array中,array扮演的是一个指针,所以该表达式就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。表达式array+n,array扮演的是指针,故array+n也是指针,他的类型是type*,指向的类型是type,指向数组第n号单元,故sizeof(array+n)测出的是指针类型的大小。

    六、指针和结构类型的关系

    struct mystruct
    {
       int a ;
       int b;
       int c;          
    }
    
    mystruct ss = {20,30,40};
    mystruct *ptr = &ss;//声明了一个指向结构对象ss的指针,它的类型是myStruct * ,指向的类型是mystruct
    
    int *pstr = (int *)&ss//声明了一个指向结构对象ss的指针。但是他的类型和它指向的类型和ptr是不同的,请问如何通过指针ptr来访问ss的三个成员变量
    

      答案:

    ptr ->a;
    ptr ->b;
    ptr ->c;
    
    请问如何通过指针pstr来访问ss的三个成员变量
    答案
    
    *pstr;
    *(pstr+1);
    *(pstr+2);
    

      这样使用pstr来访问结构成员是不正规的。那么该怎么样来通过指针访问数组的各个单元呢?

    int array[3]={35,56,37};
    int *pa = array;
    //通过指针pa访问数组array的三个单元的方法是:
    *pa;
    *(pa+1);
    *(pa+2);
    

      从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样.所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个“填充字节”,这就导致各个成员之间可能会有若干个字节的空隙。所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。

  • 相关阅读:
    在CentOS 7.6上安装VNC Server
    CentOS7.6 安装Docker
    CentOS 7.6 安装 Weblogic 12
    CentOS 7.6 安装Oracle 12c
    Spring MVC 使用介绍(五)—— 注解式控制器(一):基本介绍
    Spring MVC 使用介绍(四)—— 拦截器
    Spring MVC 使用介绍(三)—— Controller接口控制器
    Spring MVC 使用介绍(二)—— DispatcherServlet
    Spring MVC 使用介绍(一)—— 概述
    Spring 使用介绍(十三)—— Bean的生命周期
  • 原文地址:https://www.cnblogs.com/kui0621/p/4064032.html
Copyright © 2011-2022 走看看