1. 程式人生 > 其它 >定義結構體指標

定義結構體指標

# 結構體指標
## 定義一個結構體
struct My{ My *left; My *right; int val; My(){} My(int val):left(NULL),right(NULL) ,val(val){} };
### 1、一般結構體訪問
void test1(){ My m; m.val = 1; cout<<m.val<<endl; }
### 2、結構體指標訪問
&nbsp;
**注1** :宣告一個結構體指標記得初始化,一定要初始化,不初始化會出事(重要的事情說三遍)
**注2** :必須通過->符號來訪問指標所指結構體的變數
&nbsp;
(1)會報一個錯:空指標訪問異常,這是因為m這個指標還沒有初始化,因此他沒有記憶體空間,自然就不存在有val這個引數。
void test3(){ My *m; m->val = 1; }
(2)為正確開啟方式
void test3(){ My *m; m = new My(3); m->val = 4; cout<<m->val<<endl; }
## 結構體自引用
結構體的自引用,就是在結構體內部,包含指向自身型別結構體的指標。
&nbsp;
**注**:結構體定義中可以巢狀其他結構體型別的變數,不可以巢狀自己這個型別的變數。
可以巢狀自己型別的指標。
### 一、沒有typedef
錯誤情況:
struct tag_1{ struct tag_1 A; int value;
//A是一個結構體,A的內部還會有一個結構體,以此下>去,無線迴圈。在記憶體分配的時候,由於無限的巢狀,無法確定結構體的長度,所>以時非法的。
};
正確情況:
struct tag_1 { struct tsg_1 *A; int value;
//由於指標的長度時確定的(在32位機器上指標長度是4),所以編譯器能夠確定該結構體的長度 //這個指標看似指向自身,其實不是,而是執行同一型別的不同結構。 };
### 二、有typedef
錯誤情況:
typedef struct{ int value; NODE *link; }NODE; //使用typedef為結構體建立一個別名NODE。 //但是是錯誤的,因為型別名的作用域是從語句結尾開始的,而在結構體內部是不>能使用的,因為還沒有定義。
正確情況:
(1) typedef struct tag_1 { int value; struct tag_1 *link; }NODE;
(2) typedef struct tag_1 NODE; struct tag_1 { int value; NODE *link; };
(3) struct tag_1 { int value; struct tag_1 *link; }; typedef struct tag_1 NODE;