一、結構體的定義和操作
定義結構體變量:
- 先定義結構體再定義結構體變量。
- 定義結構體的同時定義結構體變量。
如下:
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;
在這裏就不細說了,到時再總結。