目录
1、结构体与结构体指针
有时候需要将不同类型的数据组合为一个整体,以便于使用。例如,一名学生有学号、姓名、性别、年龄、地址等属性,如果针对学生的学号、性别、年龄等都单独定义一个变量,那么在有多名学生时,变量就难以分清。为此,C语言提供结构体来管理不同类型的数据组合。
1.1 结构体的定义、引用、初始化
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};//结构体类型声明,注意最后一定要加分号
int main()
{
struct student s = { 1001,"lele",'m',20,98.5,"shenzhen" };
printf("%d %s %c\n", s.num, s.name, s.sex);
struct student sarr[3];
for (int i = 0; i < 3; i++)
{
scanf("%d %s %c %d %f %s", &sarr[i].num, sarr[i].name, &sarr[i].sex, &sarr[i].age, &sarr[i].score, sarr[i].addr);
}
for (int i = 0; i < 3; i++)
{
printf("%d %s %c %d %f %s", sarr[i].num, sarr[i].name, sarr[i].sex, sarr[i].age, sarr[i].score, sarr[i].addr);
}
return 0;
}
对上述代码结构体大小进行计算,4+1*20+1+4+4+1*30=50*13=63个字节,但实际结构体大小为68个字节,其原因是因为存在对齐,对齐的目的是为了提高cpu访问内存的效率,以空间换时间。
1.2 结构体指针
#include <stdio.h>
struct student
{
int num;
char name[20];
char sex;
};
int main()
{
struct student s = { 1001,"wangle",'M' };
struct student* p;
p = &s;
printf("%d %s %c\n", (*p).num, (*p).name, (*p).sex);//*p等价于s,由于.的优先级高于*,所以要加括号
printf("%d %s %c\n", p->num, p->name, p->sex);//,指针的成员选择,与上面一句等价
//结构体初始化
struct student sarr[3] = { 1001,"lilei",'M',1005,"zhangsan",'M',1003,"liming",'M' };
int num;
p = sarr;
num = p->num++;//num=p->num,p->num++
printf("num=%d,p->num=%d\n", num, p->num);//1001,1002
num = p++->num;//num=p->num,p++
printf("num=%d,p->num=%d\n", num, p->num);//num=1002,p->num=1005
}
1.3 typedef的使用
前面定义结构体变量时使用的是语句是struct student s,以这种方式来定义结构体变量有些麻烦,即每次都需要写struct student。此时,可以选择使用typedef声明新的类型名来代替已有的类型名。(typedef的作用就是取别名)
有些程序给int起别名的原因:为了实现代码即注释,提高可读性
#include <stdio.h>
//给结构体类型起别名,叫stu,起了结构体指针类型的别名,叫pstu
typedef struct student
{
int num;
char name[20];
char sex;
}stu,*pstu;
typedef int integer;
int main()
{
stu s = { 1001,"wangle",'M' };
pstu p;//stu* p1,p1也是一个结构体指针
integer i = 10;
p = &s;
printf("i=%d,p->num=%d\n", i, p->num);
return 0;
}
2、C++的引用讲解
对于C++,首先新建源文件时,名字的后缀需要是.cpp
#include <stdio.h>
void modifynum(int& b);
int main()
{
int a = 10;
modifynum(a);
printf("a=%d\n", a);
return 0;
}
//把&写到形参的位置是C++的语法,称为引用,如果在.c里这样写会编译不通
//此时操作b和操作a是等价的
void modifynum(int& b)
{
b = b + 1;
}