結構體(struct)學習總結

一、結構體的定義和操作

定義結構體變量:

  1. 先定義結構體再定義結構體變量。
  2. 定義結構體的同時定義結構體變量。
    如下:
struct node{//其中node爲結構體類型名
  char name[101];
  char number[101];
  string s;
}//one,two[101];
node one,two[101];//定義結構體變量

在定義結構體時,定義的結構體名地位等同於double,int等數據類型,在定義結構體時,系統不會爲其分配內存,只有定義結構體變量時纔會給其分配內存。

結構體變量的特點

  1. 結構體變量可以整體進行操作,這在某些數據排序方面具有很大的便利。
  2. 對結構體變量的成員訪問時也非常方便。
    例如:cout<<two[2].name
  3. 結構體變量的初始化和數組的初始類相似。
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;//定義一個指針變量

引用方式:

  1. 指針名->成員名
  2. (*指針名).成員名
    如:
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;

在這裏就不細說了,到時再總結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章