结构体(2)
结构体的大小
struct Student
{
char s_id[10];
char s_name[10];
char s_sex[8];
int s_age;
};
//void Print_Student(struct Student stud[], int n)
void Print_Student(struct Student *stud, int n) //sizeof(stud) //4字节
{
assert(stud != nullptr);
printf("%-10s %-10s %-8s %-5d\n", "id", "name", "sex", "age");
for (int i = 0;i < n;++i)
{
//printf("%-10s %-10s %-8s %-5d\n", stud[i].s_id, stud[i].s_name, stud[i].s_sex, stud[i].s_age); // (写法一)
//printf("%-10s %-10s %-8s %-5d\n", (*(stud + i)).s_id, (*(stud+i)).s_name, (*(stud + i)).s_sex, (*(stud + i)).s_age); // (写法二)
printf("%-10s %-10s %-8s %-5d\n", stud->s_id, stud->s_name, stud->s_sex, stud->s_age);
stud++;//(写法三)
}
printf("\n");
}
int main()
{
struct Student studx[10] = {
{"0901","yhping","man",23},
{"0901","chang","man",33},
{"0901","hexing","woman",13},
{"0901","lejian","man",24},
{"0901","liuxiao","woman",45},
{"0901","zhang","man",15},
{"0901","zhaowu","woman",22},
};
Print_Student(studx,7);
return 0;
}
结构体大小
由于存储变量地址对齐的问题,计算结构体大小的3条规则:
1.结构体变量的首地址,必须是结构体变量中的“最大基本数据类型成员所占字节数”的整数倍。
2.结构体变量中的每个成员相对于结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍。
3.结构体变量的总大小,为结构体变量中“最大基本数据类型成员所占字节数"的整数倍。
struct Node
{
char cha;
char chb;
int ia;//共8字节
//char cha; int ia; char chb; //共12字节
};
int main()
{
struct Node x = {'a','b',0x12345678};
int size = sizeof(x);
printf("%d \n", size);
}
struct node // double
{
char cha;
double da;
char chb;
};
sizeof(struct node);/ /24
struct node//数组
{
char ch[3];
int ia;
};
sizeof(struct node);//8
struct Node
{
char ch;
typedef union
{
int a;
float f;
}AF; //变为类型
};
int main()
{
struct Node x;
Node::AF::y;
return 0;
}
struct Node
{
char ch;
union
{
int a;
float f;
}AF;
};
int main()
{
struct Node x;
sizeof(x); //8字节
x.ch = 'a';
x.AF.a = 10;
return 0;
}
struct Node
{
char ch;
union AF
{
int a;
float f;
};
};
int main()
{
struct Node x;
printf("%d \n", sizeof(x));
Node::AF y;
return 0;
}
struct Node
{
char ch;
union //哑元
{
int a;
float f;
};
};
int main()
{
Node x; //8字节
x.ch = 'x';
x.a = 10;
x.f = 12.23;
return 0;
}
struct //哑元 (无名称)
{
char ch[2];
short x;
}x;
struct
{
char ch[2];
short x;
}y;
union Node
{
char a;
char b;
short sx;
};
int main()
{
union Node x;
x.sx = 0x0001;
if (x.b == 0) //不可判断
{
printf("小端存放");
}
else
{
printf("大端存放");
}
return 0;
}
int main()
{
short sx = 0x0001;
char* cp = (char*)&sx;
if (*cp == 1)
{
printf("小端存放");
}
else
{
printf("大端存放");
}
return 0;
}
union Node
{
unsigned char ch[2];
unsigned short sx;
};
int main()
{
union Node x; //2
x.sx = 0x6162;
printf("%c \n", x.ch[0]); //b
printf("%c \n", x.ch[1]); //a
return 0;
}
struct Student
{
const char* name; //指针4字节
int age; //4字节
};
struct Student s1; //sizeof(s1); //8
struct Student s2 = { "yhping",12 }; //8 结构体大小与存放内容无关
int main()
{
printf("s1: %d\n", sizeof(s1));
printf("s2: %d\n", sizeof(s2));
return 0;
}
struct Node
{
char cha;
char chb;
int ia;//共8字节
//char cha; int ia; char chb; //共12字节
};
int main()
{
struct Node x = {'a','b',0x12345678};
int size = sizeof(x);
printf("%d \n", size);
}
int main()
{
int a = 10,b = 20;
char buff[20];
int len = sprintf_s(buff, 20, "a=%d b=%d", a, b); //格式化打印 buff中实际有效长度为15
float ft = 12.25f;
sprintf_s(buff, 20, "%.2f", ft);
len = printf("a=%d b=%d \n", a, b);
fprintf(stderr, "a=%d b=%d \n", a, b); //标准输出设备 stderr stdout
return 0;
}