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);