//C语言中结构体中的成员域偏移量
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct _student{
char name[];//
int num;
}Student; void main(){
Student *p = NULL;
printf("%x\n", p);//打印 0
p = p - ;
printf("%x\n",p);//打印ffffdc
//说明 指针的加法运算前面已有详述,p - 1移动了 sizeof(Student)个字节
//由于结构体字节对齐原则,char name[30]数组占据32个字节,不是30个,不明白请看结构体那一章
//计算出p的步长是 32+4=36 p = p - ;
printf("%x\n", p);//打印ffff94 p = p + ;
printf("%x\n", p);//打印ffffdc
//说明:以上两个的解释同p-1 p = (Student *);
p = p - ;
printf("p - 1=%x\n", p);//打印ffffdd
p = (Student *);
p = p - p;
//警告:警告 1 warning C4047: “=”:“Student *”与“int”的间接级别不同 tec01.c 33 1 C005
//警告产生原因是p-p得出的值是int型 p是Student *类型
//由此说明:p - p和p-1有所区别,p-p只是单纯的p的值加减,p-p=0,返回值是int型,而p-1是指针间的运算,返回值是指针
printf("p - p=%x\n", p);//打印0 //结构体指针中 . ->操作符本质上是寻址,寻找每一个成员相对于结构体起始位置的内存偏移,
//该操作在cpu里执行,不会操作内存,所以 p->num等价于 ((Student *)0)->num 因为不会操作内存,所以不会报错
printf("%x\n", &(p->num));//打印20 (此处是16进制)
//说明 &(p->num)是取p->num得地址 num相对于结构体起始位置的内存偏移量是char name[30] 32个字节(结构体字节对齐原则)
system("pause");
}

C语言 结构体中的成员域偏移量的更多相关文章

  1. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  2. 读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

    原文链接:C语言结构体里的成员数组和指针 复制例如以下: 单看这文章的标题,你可能会认为好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Lar ...

  3. C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员

    设p是指向结构体变量的指针,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名.如,stu.num. (2)(*p).成员名.如,(*p).num. (3)p->成员 ...

  4. c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省 ...

  5. C语言 结构体中的零长度数组

    /* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...

  6. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  7. 结构体中string成员的问题

    在结构体中定义字符串的成员的时候要注意定义成string有时候,在某些程序中给成员赋值会崩溃,但是不确定到底什么情况会崩溃.运行报错如下: Program received signal SIGSEG ...

  8. C语言 结构体中属性的偏移量计算

    //计算结构体偏移量 #include<stdio.h> #include<stdlib.h> #include<string.h> //详解:对于offscfof ...

  9. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

随机推荐

  1. 【读书笔记】iOS-本地文件和数据安全注意事项

    一,程序文件的安全. 可通过将JavaScript源码时行混淆和加密,防止黑客轻易地阅读和篡改相关的逻辑,也可以防止自己的Web端与Native端的通讯协议泄露. 二,本地数据安全. 对于本地的重要数 ...

  2. Eclipse Svn 取消某些文件或文件夹的版本控制

    SVN提交时,我们有时候需要将一些文件忽略掉,例如:maven项目中的target文件夹,可以将这些文件或文件夹设置成ignore来忽略这些文件或文件夹 1. 将文件夹或文件从Eclipse中删除.记 ...

  3. 在类库项目中使用log4net(RollingFileAppender)记录日志

    1.创建解决方案 2.创建类库项目 3.根据需要修改命名空间,修改(和/或)添加类到类库 4.引用log4net 5.类库项目根目录下创建leg4net配置文件,如D3CallTriggerPlugi ...

  4. 《SQL Server企业级平台管理实践》读书笔记——几个系统库的备份与恢复

    master数据库 master作为数据库的主要数据库,记录着SQL Server系统的所有系统级信息,例如登录用户.系统配置设置.端点和凭证以及访问其他数据服务器所需要的信息.master数据库还记 ...

  5. redis的简单安装配置

    一.简介 Redis是一种高级key-value数据库,数据可以持久化,支持的数据类型很丰富,有字符串,哈希,链表,集合和有序集合5种数据类型 Redis支持在服务器端计算集合的并,交和补集(diff ...

  6. C++基础——子类转父类转子类 (派生类转基类转派生类)

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  7. JS的三种弹框

    <script type="text/javascript"> /*第一种*/ function ale(){ alert("这是第一种");} / ...

  8. RTB交接

    RTB产品测试进度 元数RTB产品 元数的产品已经测过两个版本,分别是1.1版本和1.2版本,目前线上跑的是1.2版本.程序线上情况目前正常,没有问题. 元数功能账号为:yuanshu  需用root ...

  9. hive的常用命令

    #从hive中直接进入hdfs的daas/bstl/term/userinfo目录下 hive> !hadoop fs -ls /daas/bstl/term/userinfo; 查看hive表 ...

  10. env,export

    这几个命令都是和Linux环境变量相关的 env 查看系统所有的环境变量,个人觉得这里面最重要的就是PATH,我们在终端敲入的命令,其实都是一个个脚本文件,那么Shell去哪找这些文件呢?搜索路径就存 ...