当前位置:   article > 正文

C语言中指针取值的分析(结构体指针)_misra 结构体指针变量取值方式

misra 结构体指针变量取值方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student
{
    int num;
    char name[64];
};
int main(int argc, char const *argv[])
{

   printf("先打印一下结构体大小:%d\n",sizeof(struct student));
   printf("%d\n",sizeof(int));
   void * node_p = (void*)malloc(sizeof(struct student)*3+sizeof(int));

   printf("void*类型:node_p指向为  :%p\n",node_p);
   printf("void*类型:node_p+1指向为:%p\n",node_p+1);
   printf("void*类型:node_p+2指向为:%p\n",node_p+2);   //因为node—p的类型是任意类型    所以位移一下,就往下走了一个字节

   /**下面是打印结果
    * node_p指向为  :0000022734076db0
      node_p+1指向为:0000022734076db1
      node_p+2指向为:0000022734076db2
    */
   
   //下面转换一下类型
   printf("int*:node_p指向为  :%p\n",(int*)node_p);
   printf("int*:node_p+1指向为:%p\n",(int*)node_p+1);
   printf("int*:node_p+2指向为:%p\n",(int*)node_p+2);   //这种情况下位移就是4个了
   
    /**
     *node_p指向为  :0000023d236f6db0
     *node_p+1指向为:0000023d236f6db4
     *node_p+2指向为:0000023d236f6db8
     * 
     */

    //然后下面我们进行一下 赋值一下int类型的个数
    *((int*)node_p) = 3;   //这样就把 整个内存最开始的数赋值为3了
    //然后我们需要将地址偏移到int类型的数的下面去  到结构体地址开头
    
    struct student * stu_t = (struct student *)(node_p +sizeof(int));
    printf("stu_t的地址为:%p\n",stu_t);
    printf("stu_t+1的地址为:%p\n",stu_t+1);
    printf("stu_t+2的地址为:%p\n",stu_t+2);
    
    /**
     * stu_t的地址为:  0000021e21056db4
     * stu_t+1的地址为:0000021e21056df8     e3c -df8 =0x44   也就是十进制的  68  所以对应上了 
     * stu_t+2的地址为:0000021e21056e3c
     */ 

    //然后对剩下的学生结构体里面的内容进行赋值
    
    printf("&stu_t[0]:%p\n",&stu_t[0]);
    printf("stu_t:%p\n",stu_t);
    /**
     * &stu_t[0]:00000176f6146db4
     * stu_t:00000176f6146db4
     */

    //进行赋值
    //stu[0]
    stu_t[0].num = 10;
    strcpy(stu_t[0].name,"name1");

    //stu[1]
    (stu_t+1)->num=20;
    strcpy((stu_t+1)->name,"name2");
    //stu[2]
    (stu_t+2)->num =30;
    strcpy((stu_t+2)->name,"name3");
    printf("%s  %d\n",__FILE__,__LINE__);

    //进行循环取值
    //首先拿到int类型的num  读出结构体数组内有多少个成员
    int * num_t = (int*)node_p;
    printf("打印一下看看拿到了没有num_t:%d\n",*num_t);
    //然后拿到结构体数组的首地址进行遍历打印
    struct student * stu_l = (struct student *)(node_p+sizeof(int));
    for(int i=0;i<3;i++)
    {
        printf("num=%d,name = %s\n",stu_l[i].num,stu_l[i].name);
    }
    /**
     * 打印一下看看拿到了没有num_t:3
     * num=10,name = name1
     * num=20,name = name2
     * num=30,name = name3
     */
   return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92

以下是运行结果
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/算法设计者/article/detail/63201
推荐阅读
相关标签
  

闽ICP备14008679号