一、结构体的定义和操作
定义结构体变量:
- 先定义结构体再定义结构体变量。
- 定义结构体的同时定义结构体变量。
如下:
struct node{//其中node为结构体类型名
char name[101];
char number[101];
string s;
}//one,two[101];
node one,two[101];//定义结构体变量
在定义结构体时,定义的结构体名地位等同于double,int等数据类型,在定义结构体时,系统不会为其分配内存,只有定义结构体变量时才会给其分配内存。
结构体变量的特点
- 结构体变量可以整体进行操作,这在某些数据排序方面具有很大的便利。
- 对结构体变量的成员访问时也非常方便。
例如:cout<<two[2].name - 结构体变量的初始化和数组的初始类相似。
node three={"liming","110","hello"};
成员调用
一般形式为:结构体变量名.成员名
也就是:
node one,two[101];
cin>>one.name>>one.s;
cin>>two[1].name;
成员函数的调用
一般形式为:结构体变量名.成员函数
结构体成员函数默认将结构体变量作为引用参数。
如:
#include<iostream>
#include<string>
using namespace std;
struct node{//其中node为结构体类型名
char name[101];
char number[101];
string s;
void input(){
cin>>name>>number>>s;
}
void output(){
cout<<name<<endl;
cout<<number<<endl;
cout<<s<<endl;
}
};//one,two[101];
int main()
{
node one,two[101];
one.input();
one.output();
return 0;
}
运行结果:
liming
110
hello
liming
110
hello
Process returned 0 (0x0) execution time : 23.697 s
Press any key to continue.
二、结构体指针
结构体指针的定义和使用
基本与基本类型指针的定义一样
结构体名*结构体变量名
struct node{
int a;
char name[101];
}*one;//定义一个指针变量
引用方式:
- 指针名->成员名
- (*指针名).成员名
如:
struct node{
int a;
char name[101];
}two;
node *one=&two;
cin>>one->a;
strcpy(one->name,"hello word");//cin>>one->name;
cout<<one->a<<endl;//(*one).a;
cout<<one->name<<endl;
以上内容放在编译器内是不能运行的,只是为了解释方便。
注意:对字符数组赋值时用strcpy与cin是不一样的,前者可以加上空格,而后者加上空格则会导致结果出现偏差。
自引用结构
在结构体内部包含一个类型为该结构的成员这是非法的。
如:
struct node{
int a;
char name[101];
node p;//错的
}two;
其中p的存在是非法的,因为成员p又是另外一个完整的结构,而p的结构中又有成员p,这就有点像永远不会停止的递归,是非法的。但,如果是结构体指针的话就是合法的。
如:
struct node{
int a;
char name[101];
node *p;
}two;
为什么这是合法的呢?
因为其中指针的长度在被定义前就一定被编译器知道,而如果其中不是指针而是结构体那么编译器是不知道它的长度的,自然会报错。
那么这种自引用结构有什么用呢?
这是实现其他结构的基础,是实现动态结构数组的基础,其中包括链表、堆、栈、树,都是自引用结构实现的。
如下就是链表结构。
struct node{
int a;
char name[101];
node *next;
}point;
在这里就不细说了,到时再总结。