今天对结构体进行了认识,以及一些结构体的注意点
一、结构体
1、基础解释
1、结构体是复合数据,内部存储不同的类型
2、结构体是用struct(关键字) student(名称)
3、结构体也可以没有名称,但是不能调用
4、结构体的定义: struct student s1
5、结构体变量的初始化:struct student s1={数据按结构体里类型的顺序填写,用逗号隔开}
6、变量引用成员用“ . ”,指针引用成员用“ -> ”
例如:printf("%d %s",s1.id,s1->name)
7、一些结构体初始化,定义的程序
#include <stdio.h>
struct Family
{
int age;
char name[20];
char chenghu[20];
}s3;
int main1()
{
struct Family s1 = {20,"gmf","son"};
s1.age = 15;
printf("age = %d,mane =%s,chegnhu=%s\n",s1.age,s1.name,s1.chenghu);
struct Family *s2 = &s1;
s1.age = 16;
printf("age = %d,mane =%s,chegnhu=%s\n",s2->age,s2->name,s2->chenghu);
return 0;
}
2、内存对齐问题
1、结构体的排列方式不同,空间的大小是不同的
2、结构体开辟空间有一些约束的条件
(1)结构体成员的首地址要能被该成员的类型整除
(2)结构体每次分配空间都是按最大类型分配的
(3)如果分配空间够用,就不用分配
(4)如果当前类型大于系统系数的时候,按系数标准进行分配空间,否则按最大类型分配空间
3、结构体可以当实参传送,但空间过大一般传结构体使用指针传送地址
二、共用体
1、顾名思义,共用体就是所有成员公用一段内存,后初始化的值会覆盖原来的。
2、共用体的大小是成员中占据最大的成员的大小
3、运用公用体可以判断内存是大端还是小端
(1)大端:低位的数放在高地址,高位的数放在低地址
(2)小端:低位的数放在低地址,高位的数放在高地址
4、判断大小端的程序
#include <stdio.h>
int func()
{
union
{
unsigned int a;
unsigned char b;
}t;
t.a = 0x1234;
return (t.b == 0x34);
}
int main()
{
if( 1 == func())
printf("小端\n");
else
printf("大端\n");
return 0;
}
三、枚举
1、枚举是用enum,用于定义常量
2、enum day(可以不写) {one,two,…};第一个值默认从0开始,每个数都可以赋初值,但下一个数就是这个数+1
四、寻找两个数组的最大子串(有两个相同长度的子串时默认打印前一个)
/*--------------------寻找最大共子串(暴力求解)-----------*/
#include <stdio.h>
#include <string.h>
void StrCmp(char *p1,char *p2)
{
char a[50] = {0}; //用来存放找到的相同数
char b[50] = {0}; //用了找最大的
int i,j;
int count = 0;
int len1 = strlen(p1);
int len2 = strlen(p2);
for(i = 0; i < len1; i++) //str1
{
int n = i;
strcpy(a,"\0");
for(j = 0; j < len2; j++) //str2
{
int m = j;
while(p1[m] == p2[n] && p1[n] != '\0') //判断是否相同,同时将数据给a,直到两个不同时跳出
{
a[count] = p2[n];
n++;
m++;
count++;
}
if(strlen(a) > strlen(b)) //每次判断b数组是否是最大的
{
strcpy(b,a);
}
count = 0;
}
}
puts(b);
}
int main1()
{
char str1[]="aocdfedfg";
char str2[]="bacdfae";
StrCmp(str1,str2);
return 0;
}