引言:
有时候需要将不同类型的数据组合为一个整体,以便于引用。例如,一名学生有学号、姓名、性别、年龄、地址等属性,如果针对学生的学号、姓名、年龄等都单独定义一个变量,那么在有多名学生时,变量就难以分清。为此,C语言提供结构体来管理不同类型的数据组合。e
一、结构体与结构体指针
1.1结构体的定义、引用、初始化
声明一个结构体类型的一般形式为
struct 结构体名
{成员列表};
在C++中可以不用写struct ,在C语言中必须要写Struct关键字。
例如:
struct student
{
int number;
char name[30];
char sex;
int age;
float score;
char addr[30];
};
先声明结构体类型,在定义变量名,如
struct student studnet1,student2;
结构体声明最后一定要加分号
整型数据(%d)、浮点型数据(%f)、字符串型数据(%s)都会忽略空格,但是字符型数据(%c)不会忽略空格,所以如果要读取字符型数据,那么就要在待读取的字符数据与其他数据之间加入空格。
1.2结构体指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址.可以设置一个指针变量,用它指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。
例:结构体指针的使用
#include <stdio.h>
#include <stdlib.h>
//结构体指针
struct student{
int num;
char name[20];
char sex;
};
int main()
{
struct student s={1001,"wangle",'M'};
struct student sarr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'};
struct student *p; //定义结构体指针
int num;
p=&s;
printf("%d %s %c\n",p->num,p->name,p->sex);
p=sarr;
printf("%d %s %c\n"",(*p).num,(*p).name,(*p).sex);//方式一获取成员printf("%d %s %c\n",p->num,p->name,p->sex);//方式二获取成员printf("—---------------
-------------\n");
num=p->num++;
printf("num=%d,p->num=%d\n",num,p->num);num=p++->num;
printf("num=%d,p->num=%d\n",num,p->num);system("pause");
}
可以看到, p就是一个结构体指针,可以对结构体s取地址并赋给p,这样借助成员选择操作符,就可以通过p访问结构体的每个成员,然后进行打印。我们知道数组名中存储的是数据的首地址,所以可以将sarr赋给p,这样就可以通过两种方式访问对应的成员。
使用(p).num访问成员为什么要加括号呢?
原因是“.”成员选择的优先级高于“”(即取值)运算符,所以必须加括号,通过*p得到sarr[0],然后获取对应的成员。
二、typedef的使用
typedef的作用就是起别名。
#include <stdio.h>
#include <stdlib.h>
//结构体指针
//给结构体起别名stu,起了结构体指针别名pstu
typedef struct student{
int num;
char name[20];
char sex;
}stu,*pstu;
//stu等价于student *pstu等价于struct student *
typedef int INTEGER;
int main()
{
stu s={1001,"wangle",'M'};
pstu p;
INTEGER i=10;
p=&s;
printf("i=%d,p->num=%d\n",i,p->num);
system("pause");
}
使用stu定义结构体变量和使用struct student定义结构体变量是等价的;使用INTEGER定义变量i和使用int定义变量i是等价的; pstu等价于struct student*,所以p是结构体指针变量。
三、C++引用
对于C++,首先新建源文件时,名字需要叫main.cpp,不能像我们之前那样叫main.c,为什么王道数据结构都是用的C语言语法,但是额外使用了C++的引用呢,原因是很多数据结构都采用了这个做法。
int a;
//把&写到形参的位置是C++的语法,称为引用
void modifynum(int &b)
{
++b;
}
modifynum(a);//调用
int *p=NULL;
void modify_pointer(int *&p)//引用要和变量挨着
{
p=q;
}
modify_pointer(p);//调用
如上面两个例子所示,我们在修改函数外的某一变量时,使用了引用后,在子函数内的操作和函数外操作手法一致,这样编程效率较高,对于初学者理解也非常方便.
那这种CH+的写法,和C语言的代码又是如何对应的呢?下面我们来看一下代码对应关系。