当前位置: 首页 > news >正文

C语言基础:构造数据类型-结构体 memcpy系统函数

11、const修饰的指针

const:只读。只允许被访问,不允许修改

表示该变量只允许使用,不允许被修改,记得初始化const int num=1

const int *p; //同下 int const *p; //修饰*p,*p的内容只读,*p=num ×,p=&num √ int *const p; //修饰p,指针p只读,p=&num × const int *const p; //同下 int const *const p; //指针p只读,*p内容只读,记得初始化

12、void* 指针(万能指针)

void*:缺省类型的指针

char*,int*,short*...这些指针,不仅保存地址,还有具体指向,明确指向sizeof(基类型)个字节的空间

void *p:只是一个保存地址编号的变量

void*<-------->char*,int*,short*...

*(int *)p;

memcpy系统函数

#include<string.h> memcpy(void *dst,const void *src,sizrof(a)) 内存重叠问题
#include<stdio.h> #include<string.h> void *mymemcpy(void *dst,const void *src,int size) { char *d=(char *)dst; char *s=(char *)src; int i=0; for(i=0;i<size;++i) { *(d+i)=*(s+i); } return dst; } void show_mymencpy(void *dst,int len) { int i; char *d=(char *)dst; for(i=0;i<len;++i) { printf("%c ",d[i]); } printf("\n"); } int main() { char a1[100]={"hello"}; char a2[100]={0}; mymemcpy(a2,a1,sizeof(a1)); //int len=strlen(a2); int len=sizeof(a2)/sizeof(a2[0]); show_mymencpy(a2,len); }

构造数据类型

数据类型:short、int、long、char、float、double、void

指针类型

构造数据类型:结构体、共用体、枚举

1、结构体

1语法

struct 名字

{

数据类型 成员1;

数据类型 成员2;

数据类型 成员3;

...

};

//声明了名为struct data的新的数据类型 struct data { int year; int mon; int day; struct time mytime; };

注意

1、声明结构体时,{ }后的分号不可省略

2、结构体内,成员之间用分号隔开

3、struct后面的名称可以省略,匿名结构体

4、结构体放在全局作用域

2结构体变量定义

结构体类型 变量名;

struct data mydata;

struct

{

int year;

int mon;

int day;

}mydata;

声明结构体类型的同时,定义了变量mydata

3结构体初始化

//全部初始化 struct data mydata={2026,8,6}; struct data mydatatime={{2026,8,6},{14,6}}; //部分初始化 struct data mydata1= { .mon=8, .day=6 };

4结构体数据成员访问

  • 通过结构体变量访问结构体成员

变量名.成员1;

变量名.成员2;

变量名.成员3;

printf("%d,%d,%d", mydata.year, mydata.mon, mydata.day, };
  • 通过结构体指针访问结构体成员

结构体指针->成员1;

结构体指针->成员2;

结构体指针->成员3;

5结构体的存储方式

原则:

1.结构体成员在内存中存储时,成员必须存储在自己字节大小的整数倍位置

2.结构体整体占内存大小,一定是结构体中最大成员字节数的整数倍

注意:

1.在不同操作位系统下,相同结构体在内存中占用内存空间可能不一样。

64位系统,long类型和指针类型占8字节;而32位系统,long类型和指针类型占4字节

2.可以强制让结构体按指定字节数对齐

#pragma pack(1)//以下强制按1字节对齐 struct s {}; #pragma pack()//取消1字节对齐

6结构体做函数参数

两种传参方式:

如果要在被调函数中修改主调函数中的结构体变量,则传递结构体变量的地址

如果在被调函数中仅使用主调函数中定义的结构体变量,可以值传递,也可以地址传递

#include<stdio.h> struct stu { char name[32]; int age; int score; }; struct stu get_stu_info() { struct stu s; scanf("%s",s.name); scanf("%d",&s.age); scanf("%d",&s.score); return s; } void get_stu_info_1(struct stu *s) { scanf("%s",s->name); scanf("%d",&s->age); scanf("%d",&s->score); } int main() { struct stu s; s=get_stu_info(); printf("%s %d %d\n",s.name,s.age,s.score); get_stu_info_1(&s); printf("%s %d %d\n",s.name,s.age,s.score); return 0; }

7.结构体数组

struct 名称 数组名[元素个数];

struct stu array[3]={{"zhangsan",20,100},{"lisi",21,90},{"wanger",22,85}};

array[下标];类型---》struct stu类型

结构体数组的三种访问方式 printf("%s %d %d\n",s[i].name,s[i].age,s[i].score); printf("%s %d %d\n",(s+i)->name,(s+i)->age,(s+i)->score); printf("%s %d %d\n",(*(s+i)).name,(*(s+i)).age,(*(s+i)).score);
http://www.cnnetsun.cn/news/3905939.html

相关文章:

  • AI 观测站|AI 开始让传统运维解释不了问题
  • 财务软件凭证录入规范:摘要怎么写、科目怎么选、附件怎么贴
  • 秒杀场景下基于Jackson流式解析与JVM内存管控的流量控制方案
  • C语言指针与数组:本质区别与高级应用
  • 利用ccglass观测AI Agent内部工作流:从Claude编写贪吃蛇游戏看透LLM请求链路
  • Obsidian AI技能规范:从AI乱写到安全协作的标准化实践
  • 国内开发者代码管理平台选型与避坑指南
  • 大模型输出控制:Temperature与Top-K参数在LangChain中的工程实践
  • 曲靖网站建设dodoco深度解析:为什么本地企业选择专业团队是品牌突围的关键
  • 大盛供应链经验分享
  • 几十页英文行业报告怎么快速看?比逐页翻译更高效的方法
  • C#单件模式实战:从线程安全到Lazy<T>的最佳实践
  • 基于Python与Vosk的《我的世界》本地语音控制自动化方案
  • 光速极限的物理本质与理论突破探讨
  • PAT乙级1060题解析:字符串模式匹配实战技巧
  • 描述对于营销型网站建设很重要飘红效果更佳
  • Altium Designer PCB设计全流程详解:从原理图到Gerber文件输出
  • 从ReAct到Multi-Agent:AI智能体架构演进与实战设计指南
  • 自己怎么建设手机网站首页从零基础到上线的全流程实操指南
  • 企业微信自动化:如何让重复工作交给程序完成?
  • 汇川驱动器调试基本参数
  • GoQuant 图解量化面试每日一题:2-Burning Ropes
  • 前端跨域图片下载实战:Canvas中转方案与CORS策略详解
  • 从零构建多Agent系统:基于Hermes Agent的实战配置与避坑指南
  • 抓取电商数据的技术正解:商品/订单/物流/售后四类API对接实战
  • 2024建设部网站继续教育新规解读与实战避坑指南,助力建筑师资质不掉档
  • Linux下通过udev规则实现USB设备端口绑定与固定设备节点
  • 51单片机电梯控制系统设计:从状态机原理到工程实践
  • 专科生论文写作利器:9款AI工具提升效率与质量
  • Python游戏模拟器PyBoy:从复古游戏到AI训练的全栈开发指南