[c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝
一、结构体存储

#include<stdio.h>
#include<stdlib.h> struct info{
char c; //1 2 4 8
double num; //1 2 4 8 char short int double
char ch[]; //9 10 12 16 }; void main() {
printf("%d\n",sizeof(struct info));
struct info in={'a',5.2,"hello"};
printf("%p\n",&in);
printf("%p\n",&in.c);
printf("%p\n",&in.num);
printf("%p\n",&in.ch); system("pause");
}

二、枚举类型(限定取值)
枚举常量实质是整型数据
#include<stdio.h>
#include<stdlib.h> //枚举的一般形式,限定在这个范围内取值
//如果没有一个赋初值,就会从0循环到最后一个,每次加1
//如果第一个赋初值,后面每个加1
//除非自己赋值,否则计算机赋值会让每个枚举常量都不同
enum level{
司令=,军长=,师长,旅长,团长,营长,连长,排长,班长,士兵
}; void main() {
enum level l1=司令;
enum level l2=军长;
enum level l3=师长;
printf("%d\n",l1);
printf("%d\n",l2);
printf("%d\n",l3); system("pause");
}

三、typedef
#include<stdio.h>
#include<stdlib.h> typedef int aa; //typedef没有创建数据类型,给已经有的数据类型起一个别名.编译时处理,仅适用于类型
#define zhengshu num //define是替换,预处理,适用于任何场合 void main() {
aa zhengshu=;
printf("%d\n",num);
system("pause");
}

#include<stdio.h>
#include<stdlib.h> typedef int I;//给int一个别称
typedef int* IP;
void main() {
I num=;//int num=100
IP p=#//int *p=&num
printf("%d,%d\n",num,*p);
printf("%p,%p\n",&num,p);
system("pause");
}

#include<stdio.h>
#include<stdlib.h> void main() {
/*int a[10];
int s[10];*/
typedef int s[];//重定义数组类型
s x;
for (int i = ; i < ; i++)
{
x[i]=i;
printf("%d\n",x[i]);
}
system("pause");
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h> struct info{
char name[];
int num;
}; typedef struct info I;//I=struct info
typedef struct info* P;//P=struct info* void main() {
I s;
strcpy(s.name,"yincheng");
s.num=;
printf("%s,%d\n",s.name,s.num); P ip=(P)malloc(sizeof(I));
strcpy(ip->name,"yincheng8848");
ip->num=;
printf("%s,%d\n",(*ip).name,ip->num);
free(ip); system("pause");
}

#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct tel{
char name[];
long long num;
}T,*P; void main() {
printf("%d\n",sizeof(struct tel));
printf("%d\n",sizeof(T));
printf("%d\n",sizeof(P)); T t1;
strcpy(t1.name,"yincheng");
t1.num=;
printf("%s,%lld\n",t1.name,t1.num); P pt1=(P)malloc(sizeof(T));//malloc之后记得要free
strcpy(pt1->name,"尹成");
pt1->num=;
printf("%s,%d\n",(*pt1).name,pt1->num);
free(pt1); system("pause");
}

四、深拷贝和浅拷贝
#include<stdio.h>
#include<stdlib.h>
#include<string.h> typedef struct string{
char *p;
int len;
}S; //浅拷贝,共享内存
void main1() {
S s1,s2;
s1.len=;
s1.p=(char *)malloc(sizeof(char)*);
strcpy(s1.p,"hello");
printf("s1.p=%s\n",s1.p);
s2.len=s1.len;
s2.p=s1.p;
*(s1.p)='K';
printf("s2.p=%s\n",s2.p); system("pause");
}
//深拷贝,拷贝内存内容
void main() {
S s1,s2;
s1.len=;
s1.p=(char *)malloc(sizeof(char)*);
strcpy(s1.p,"hello");
printf("s1.p=%s\n",s1.p);
s2.len=s1.len;
s2.p=(char *)malloc(sizeof(char)*);
strcpy(s2.p,s1.p);
*(s1.p)='K';
printf("s2.p=%s\n",s2.p); system("pause");
}
浅拷贝

深拷贝

[c/c++] programming之路(28)、结构体存储和内存对齐+枚举类型+typedef+深拷贝和浅拷贝的更多相关文章
- C 语言结构体 struct 及内存对齐
struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include & ...
- C++ 自定义结构体和类 内存对齐
为什么要提出内存对齐? 比如这么一种处理器,它每次读写内存的时候都从某个8倍数的地址开始,一次读出或写入8个字节的数据,假如软件能保证double类型的数据都从8倍数地址开始,那么读或写一个doubl ...
- C/C++ 结构体成员在内存中的对齐规则(转载)
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...
- C/C++ 结构体成员在内存中的对齐规则
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因 ...
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
来自:http://blog.163.com/zhangzhifeng688%40126/blog/static/1652627582010102261748481/ 给结构体指针分配内存 但在很多 ...
- C++中的结构体所占内存空间总结
因为结构体有时候需要字节对齐.一般而言,struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度. 在默认情况下,编译器为每一个变量或数据单元 ...
- 【C/C++】【VS开发】结构体存储空间数据对齐说明
关于内存对齐 一: 1.什么是内存对齐 假设我们同时声明两个变量: char a; short b; 用&(取地址符号)观察变量a, b的地址的话,我们会发现(以16位CPU为例): 如果a的 ...
- C/C++编程笔记:C语言对齐问题【结构体、栈内存以及位域对齐】
引言 考虑下面的结构体定义: 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始地址是0,则s的地址就是1,c2的地址是3,i的地址是4. 现在,我们编写一个简单的程序: 运行后输出: 为什么会这 ...
- c语言学习笔记之结构体存储
今天讲讲结构体存储问题 首先,结构体简单说是对不同类型的封装,一开始我们可能会想结构体在内存中的存储的大小是直接元素的和 例如 我们可能会觉得是 结构体大小=int(4个字节)+ short(2个字节 ...
随机推荐
- Java+Selenium向文本框输入内容以后模仿键盘的"ENTRY"
在自动化测试中我们避免不了要模仿一些键盘上按钮的操作,普通的字母,数字,特殊符号,这些都是很简单的,有时候我们也会模仿"SHIFT","ALT","C ...
- Django中web开发用md5加密图片名并存储静态文件夹
一般在开发中,有的网站存在大量图片,首先图片的名称是不能重复的, 但是除了数据库可用的id以外我们可以用time模块中time.time()获取的时间来进行md5加密操作, 因为time模块所产生的时 ...
- C#中$的用法
class Program { static void Main(string[] args) { string tbName = "User"; string colName = ...
- [daily]gtk程序不跟随系统的dark主题
问题描述: 我的系统主题是dark的.在使用mysql-workbench是,里边的一些线条就跟随了系统文字的主要使用了灰白色. 这样在白色画布里就看不见这些线条了. 方法: 设置mysql-work ...
- RF - selenium - 常用关键字 - 示例
1. 打开浏览器 Open Browser http://www.baidu.com chrome 2. 关闭浏览器 Close Browsers Close All Browser 3. ...
- SM3杂凑算法Python语言实现——第三部分
SM3杂凑算法实现--第三部分 一.SM3 密码概述 我们首先把需要用到的算法呈现出来,最后我们再考虑如何集合为一个库的方法,这一部分我们就开始编写一个新的算法:国家商用密码标准SM3密 ...
- css table之合并单元格
colspan 是合并列,rowspan是合并行,合并行的时候,比如rowspan="2",它的下一行tr会少一列:合并列的时候 colspan="2",此行的 ...
- C# 图片识别
项目需要识别图片上的信息,网上搜索试了Asprise-OCR.Microsoft Office Document Imaging(Office 2007) 组件实现两种方式,后者可以识别中文等其他语言 ...
- java实验一总结
实验一第一部分 在Linux中运行结果 通过cd和mkdir命令建立tree,带包编译并用 javac -d bin 的命令将编译文件保存在bin目录中 通过 java -cp 的命令运行带包的程序 ...
- java中的类型转换
java中的类型转换分为两种 自动类型转换 要实现数据的自动类型转换必须同时满足下面两个条件 两种数据类型彼此兼容 目标类型的取值范围大于原类型范围 强制类型转换 当两种数据类型彼此不兼容,或者说目标 ...