第一篇:typedef struct與struct的區別ios
1. 基本解釋c++
typedef爲C語言的關鍵字,做用是爲一種數據類型定義一個新名字。這裏的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。編程
在編程中使用typedef目的通常有兩個,一個是給變量一個易記且意義明確的新名字,另外一個是簡化一些比較複雜的類型聲明。數據結構
至於typedef有什麼微妙之處,請你接着看下面對幾個問題的具體闡述。函數
2. typedef & 結構的問題ui
當用下面的代碼定義一個結構時,編譯器報了一個錯誤,爲何呢?莫非C語言不容許在結構中包含指向它本身的指針嗎?請你先猜測一下,而後看下文說明:spa
typedef struct tagNode
{
char *pItem;
pNode pNext;
} *pNode;指針
答案與分析:對象
一、typedef的最簡單使用內存
typedef long byte_4;
給已知數據類型long起個新名字,叫byte_4。
二、 typedef與結構結合使用
typedef struct tagMyStruct
{
int iNum;
long lLength;
} MyStruct;
這語句實際上完成兩個操做:
1) 定義一個新的結構類型
struct tagMyStruct
{
int iNum;
long lLength;
};
分析:tagMyStruct稱爲「tag」,即「標籤」,其實是一個臨時名字,struct 關鍵字和tagMyStruct一塊兒,構成了這個結構類型,不管是否有typedef,這個結構都存在。
咱們能夠用struct tagMyStruct varName來定義變量,但要注意,使用tagMyStruct varName來定義變量是不對的,由於struct 和tagMyStruct合在一塊兒才能表示一個結構類型。
2) typedef爲這個新的結構起了一個名字,叫MyStruct。
typedef struct tagMyStruct MyStruct;
所以,MyStruct實際上至關於struct tagMyStruct,咱們可使用MyStruct varName來定義變量。
答案與分析
C語言固然容許在結構中包含指向它本身的指針,咱們能夠在創建鏈表等數據結構的實現上看到無數這樣的例子,上述代碼的根本問題在於typedef的應用。
根據咱們上面的闡述能夠知道:新結構創建的過程當中遇到了pNext域的聲明,類型是pNode,要知道pNode表示的是類型的新名字,那麼在類型自己尚未創建完成的時候,這個類型的新名字也還不存在,也就是說這個時候編譯器根本不認識pNode。
解決這個問題的方法有多種:
1)、
typedef struct tagNode
{
char *pItem;
struct tagNode *pNext;
} *pNode;
2)、
typedef struct tagNode * pNode;
struct tagNode
{
char *pItem;
pNode pNext;
};
注意:在這個例子中,你用typedef給一個還未徹底聲明的類型起新名字。C語言編譯器支持這種作法。
3)、規範作法:
typedef uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
這個之前沒有看到過,我的認爲是宇定義一個uint32的指針函數,uint16*, uint32 爲函數裏的兩個參數; 應該至關於#define uint32 (* ADM_READDATA_PFUNC)( uint16*, uint32 );
struct在代碼中常見兩種形式:
struct A
{
//...
};
struct
{
//...
} A;
這實際上是兩個徹底不一樣的用法:
前者叫作「結構體類型定義」,意思是:定義{}中的結構爲一個名稱是「A」的結構體。
這種用法在typedef中通常是:
typedef struct tagA //故意給一個不一樣的名字,做爲結構體的實名
{
//...
} A; //結構體的別名。
後者是結構體變量定義,意思是:以{}中的結構,定義一個名稱爲"A"的變量。這裏的結構體稱爲匿名結構體,是沒法被直接引用的。
也能夠經過typedef爲匿名結構體建立一個別名,從而使得它能夠被引用:
typedef struct
{
//...
} A; //定義匿名結構體的別名爲A
第二篇:在C和C++中struct和typedef struct的區別
在C和C++有三種定義結構的方法。
typedef struct {
int data;
int text;
} S1;
//這種方法能夠在c或者c++中定義一個S1結構
struct S2 {
int data;
int text;
};
// 這種定義方式只能在C++中使用,而若是用在C中,那麼編譯器會報錯
struct {
int data;
int text;
} S3;
這種方法並無定義一個結構,而是定義了一個s3的結構變量,編譯器會爲s3分配內存。
void main()
{
S1 mine1;// OK ,S1 是一個類型
S2 mine2;// OK,S2 是一個類型
S3 mine3;// OK,S3 不是一個類型
S1.data = 5;// ERROR S1 是一個類型
S2.data = 5;// ERROR S2 是一個類型
S3.data = 5;// OK S3是一個變量
}
另外,對與在結構中定義結構自己的變量也有幾種寫法
struct S6 {
S6* ptr;
};
// 這種寫法只能在C++中使用
typedef struct {
S7* ptr;
} S7;
// 這是一種在C和C++中都是錯誤的定義
若是在C中,咱們可使用這樣一個「曲線救國的方法「
typedef struct tagS8{
tagS8 * ptr;
} S8;
第三篇:struct和typedef struct
分三塊來說述:
1 首先:
在C中定義一個結構體類型要用typedef:
typedef struct Student
{
int a;
}Stu;
因而在聲明變量的時候就可:Stu stu1;
若是沒有typedef就必須用struct Student stu1;來聲明
這裏的Stu實際上就是struct Student的別名。
另外這裏也能夠不寫Student(因而也不能struct Student stu1;了)
typedef struct
{
int a;
}Stu;
但在c++裏很簡單,直接
struct Student
{
int a;
};
因而就定義告終構體類型Student,聲明變量時直接Student stu2;
===========================================
2其次:
在c++中若是用typedef的話,又會形成區別:
struct Student
{
int a;
}stu1;//stu1是一個變量
typedef struct Student2
{
int a;
}stu2;//stu2是一個結構體類型
使用時能夠直接訪問stu1.a
可是stu2則必須先 stu2 s2;
而後 s2.a=10;
===========================================
3 掌握上面兩條就能夠了,不過最後咱們探討個沒多大關係的問題
若是在c程序中咱們寫:
typedef struct
{
int num;
int age;
}aaa,bbb,ccc;
這算什麼呢?
我我的觀察編譯器(VC6)的理解,這至關於
typedef struct
{
int num;
int age;
}aaa;
typedef aaa bbb;
typedef aaa ccc;
也就是說aaa,bbb,ccc三者都是結構體類型。聲明變量時用任何一個均可以,在c++中也是如此。可是你要注意的是這個在c++中若是寫掉了typedef關鍵字,那麼aaa,bbb,ccc將是大相徑庭的三個對象。
第四篇:C/C++中typedef struct和struct的用法
struct _x1 { ...}x1; 和 typedef struct _x2{ ...} x2; 有什麼不一樣?
其實, 前者是定義了類_x1和_x1的對象實例x1, 後者是定義了類_x2和_x2的類別名x2 ,
因此它們在使用過程當中是有取別的.請看實例1.
[知識點]
結構也是一種數據類型, 可使用結構變量, 所以, 象其它 類型的變量同樣, 在使用結構變量時要先對其定義。
定義結構變量的通常格式爲:
struct 結構名
{
類型 變量名;
類型 變量名;
...
} 結構變量;
結構名是結構的標識符不是變量名。
另外一種經常使用格式爲:
typedef struct 結構名
{
類型 變量名;
類型 變量名;
...
} 結構別名;
另外注意: 在C中,struct不能包含函數。在C++中,對struct進行了擴展,能夠包含函數。
======================================================================
實例1: struct.cpp
#include <iostream>
using namespace std;
typedef struct _point{
int x;
int y;
}point; //定義類,給類一個別名
struct _hello{
int x,y;
} hello; //同時定義類和對象
int main()
{
point pt1;
pt1.x = 2;
pt1.y = 5;
cout<< "ptpt1.x=" << pt1.x << "pt.y=" <<pt1.y <<endl;
//hello pt2;
//pt2.x = 8;
//pt2.y =10;
//cout<<"pt2pt2.x="<< pt2.x <<"pt2.y="<<pt2.y <<endl;
//上面的hello pt2;這一行編譯將不能經過. 爲何?
//由於hello是被定義了的對象實例了.
//正確作法以下: 用hello.x和hello.y
hello.x = 8;
hello.y = 10;
cout<< "hellohello.x=" << hello.x << "hello.y=" <<hello.y <<endl;
return 0;
}
第五篇:問答
Q:用struct和typedef struct 定義一個結構體有什麼區別?爲何會有兩種方式呢?
struct Student
{
int a;
} stu;
typedef struct Student2
{
int a;
}stu2;
A:
事實上,這個東西是從C語言中遺留過來的,typedef能夠定義新的複合類型或給現有類型起一個別名,在C語言中,若是你使用
struct xxx
{
}; 的方法,使用時就必須用 struct xxx var 來聲明變量,而使用
typedef struct
{
}的方法 就能夠寫爲 xxx var;
不過在C++中已經沒有這回事了,不管你用哪種寫法均可以使用第二種方式聲明變量,這個應該算是C語言的糟粕。