程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言中結構體與指針的若干問題(在數據結構中的應用)

C語言中結構體與指針的若干問題(在數據結構中的應用)

編輯:關於C

【 注】:

在講下面的東西之前,先講幾個易錯的東西,

1.sizeof 這個東西看起來像是函數,其實不是就是一個運算符,求字節的。

int a = sizeof(int);

這裡就求出來了int型占用的是4個字節(這裡依據個人電腦版本不同會有出入,我的是win7 64位)。

 

 

2. define 這個就是給一個東西起一個新的名字例如

#define MAXN 100

那麼以後在使用MAXN這個的時候它代表的就不是字符串了,而是100.

也可以用來定義函數

#define max(x, y) x > y ? x : y

3.typedef

這個其實和上一個很像。這個東西在學習數據結構的時候經常出現,

例如當大家第一次看到

ElemType SqList()
{
...
...
}

的時候會覺得這ElemType是什麼類型,都沒看過.
這時大家就可以在書的最前面找到
typedef int ElemType;
這裡代表的就是給 int 起一個別名,叫做ElemType.
在數據結構中這麼做是為了調Bug的時候很方便。好了基礎的鋪墊就講這麼多。

一、首先什麼是結構體:

 


大家都知道數據類型吧,int 整形, char 字符型, float 單精度 , double 雙精度, 等等都是C語言等其他高級語言自帶的數據類型。



數組就是用戶自己定義的數據類型,結構體 struct 也是用戶自己定義的數據類型。


Example:

int a[MAXN]; //MAXN 之前定義為10
那麼這個a數組可以存儲10個整形的元素

char b[MAXN];
那麼這個b數組可以存儲10個字符型的元素

那麼如果我想在一個數組裡存儲不同類型的元素怎麼辦。
這裡就設計了一個好的數據類型---->struct 結構體。
結構體可以把系統已經有的不同的數據類型或用戶定義的結構型。

Example
typedef struct
{
int a;
char c;
float c;
}TypeA;

這是一個新的數據類型,TypeA型。

具體調用可以這樣使用:

TypeA.a = 10;
TypeA.b = 'a';
TypeA.c = 1.8;
...
...
...


還可以用這個定義數組
TypeA m[3];
這時每個數組的元素都有了三個屬性。
m[0].a = 20;
m[0].b = 's';
m[0].c = 4.5;
...
...
...

以上就是結構體的使用,各位小伙伴懂了嗎?


二、接下來是指針

 

指針和結構體一樣,都是數據類型,只不過指針型變量內部裝的是變量的地址。
共過它可以找出這個變量在內存中的位置,就像一個指示方向的指針,指出了某個變量的位置,
因此叫做指針型。


定義規則:
int *a; //指向整形變量的指針
char *b; //指向字符型變量的指針
float *c; //指向浮點型變量的指針
TypeA *d; //指向TypeA型變量的指針
...
...
...

這裡可以對比一下直接定義int等....
如果a是個指針型變量,且它已經指向一個變量b,則a中存放的變量b所在的地址。
*a就是取變量b的內容(X = *a; 等價於x = b;)
&b就是取變量b的地址。
a = &b;就是把變量b的地址放在變量a中。



三、結構體與指針的混用
如鏈表的定義:
typedef struct Node
{
int data; //這裡默認的是int型,如需要其他類型可直接修改
struct Node *next; //指向Node型變量的指針
}Node;


二叉樹的定義:
tyedef struct BTNode
{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode;

還可以
tyedef struct BTNode
{
int data;
struct BTNode *lchild;
struct BTNode *rchild;
}BTNode, *btnode;

這裡多了一個*btnode.
在定義一個結點指針p的時候,
BTNode *p; 與 btnode p;等價



這裡的使用還不同。

BTNode.data = 10;

(*BTNode)->data = 10;

大家看出區別沒,
如果前面BTNode定義的是普通的變量調用就是” . “
如果是指針類型的就是->.

基本就是這些不太容易懂得,也歡迎各位補充。

大家懂了嗎?




 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved