C语言中指针取值的分析(结构体指针)

#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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值