日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

typedef的用法

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 typedef的用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

結構體定義:struct與typedef struct 用法詳解和用法小結
分類: C/C++ 2011-10-16 13:44 4446人閱讀 評論(3) 收藏 舉報
struct編譯器fun語言ciostream

一、typedef的用法

在C/C++語言中,typedef常用來定義一個標識符及關鍵字的別名,它是語言編譯過程的一部分,但它并不實際分配內存空間,實例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增強程序的可讀性,以及標識符的靈活性,但它也有“非直觀性”等缺點。

二、#define的用法

define為一宏定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實現那些“表面似和善、背后一長串”的宏,它本身并不在編 譯過程中進行,而是在這之前(預處理過程)就已經完成了,但也因此難以發現潛在的錯誤及其它代碼維護問題,它的實例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) 在Scott Meyer的Effective C++一書的條款1中有關于#define語句弊端的分析,以及好的替代方法,大家可參看。

三、typedef與#define的區別

從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為標識符另起的新名稱(僅僅只是個別名),而#define原本在C中是為了定義常量 ,到了C++,const、enum、inline的出現使它也漸漸成為了起別名的工具。有時很容易搞不清楚與typedef兩者到底該用哪個好,如#define INT int這樣的語句,用typedef一樣可以完成,用哪個好呢?我主張用typedef,因為在早期的許多C編譯器中這條語句是非法的,只是現今的編譯器又做了擴充。為了盡可能地兼容,一般都遵循#define定義“可讀”的常量以及一些宏語句的任務,而typedef則常用來定義關鍵字、冗長的類型的別名。 宏定義只是簡單的字符串代換(原地擴展),而typedef則不是原地擴展,它的新名字具有一定的封裝性,以致于新命名的標識符具有更易定義變 量的功能。請看上面第一大點代碼的第三行: typedef (int*) pINT; 以及下面這行: #define pINT2 int* 效果相同?實則不同!實踐中見差別:pINT a,b;的效果同int *a; int *b;表示定義了兩個整型指針變量。而pINT2 a,b;的效果同int *a, b; 表示定義了一個整型指針變量a和整型變量b。 注意:兩者還有一個行尾;號的區別哦!

一 const基礎

如果const關鍵字不涉及到指針,我們很好理解,下面是涉及到指針的情況:

int b = 500; const int* a = &b; [1] int const a = &b; [2] int const a = &b; [3] const int* const a = &b; [4]

如果你能區分出上述四種情況,那么,恭喜你,你已經邁出了可喜的一步。不知道,也沒關系,我們可以參考《Effective c++》Item21上的做法,如果const位于星號的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;如果const位于星號的右側,const就是修飾指針本身,即指針本身是常量。因此,[1]和[2]的情況相同,都是指針所指向的內容為常量(const放在變量聲明符的位置無關),這種情況下不允許對內容進行更改操作,如不能*a = 3 ;[3]為指針本身是常量,而指針所指向的內容不是常量,這種情況下不能對指針本身進行更改操作,如a++是錯誤的;[4]為指針本身和指向的內容均為常量。
另外const 的一些強大的功能在于它在函數聲明中的應用。在一個函數聲明中,const 可以修飾函數的返回值,或某個參數;對于成員函數,還可以修飾是整個函數。有如下幾種情況,以下會逐漸的說明用法:

A& operator=(const A& a); void fun0(const A* a ); void fun1( ) const; // fun1( ) 為類成員函數 const A fun2( );

二 const的初始化

先看一下const變量初始化的情況
1) 非指針const常量初始化的情況:

A b; const A a = b;

2) 指針(引用)const常量初始化的情況:

A* d = new A(); const A* c = d; 或者:const A* c = new A(); 引用: A f; const A& e = f; // 這樣作e只能訪問聲明為const的函數,而不能訪問一般的成員函數;

[思考1]: 以下的這種賦值方法正確嗎?
const A* c=new A();
A* e = c;
[思考2]: 以下的這種賦值方法正確嗎?
A* const c = new A();
A* b = c;

三 作為參數和返回值的const修飾符

其實,不論是參數還是返回值,道理都是一樣的,參數傳入時候和函數返回的時候,初始化const變量
1 修飾參數的const,如 void fun0(const A* a ); void fun1(const A& a);
調用函數的時候,用相應的變量初始化const常量,則在函數體中,按照const所修飾的部分進行常量化,如形參為const A* a,則不能對傳遞進來的指針的內容進行改變,保護了原指針所指向的內容;如形參為const A& a,則不能對傳遞進來的引用對象進行改變,保護了原對象的屬性。
[注意]:參數const通常用于參數為指針或引用的情況;
2 修飾返回值的const,如const A fun2( ); const A* fun3( );
這樣聲明了返回值后,const按照”修飾原則”進行修飾,起到相應的保護作用。

const Rational operator*(const Rational& lhs, const Rational& rhs) { return Rational(lhs.numerator() * rhs.numerator(), lhs.denominator() * rhs.denominator()); }

返回值用const修飾可以防止允許這樣的操作發生:

Rational a,b; Radional c; (a*b) = c;

一般用const修飾返回值為對象本身(非引用和指針)的情況多用于二目操作符重載函數并產生新對象的時候。
[總結] 一般情況下,函數的返回值為某個對象時,如果將其聲明為const時,多用于操作符的重載。通常,不建議用const修飾函數的返回值類型為某個對象或對某個對象引用的情況。
原因如下:
如果返回值為某個對象為const(const A test = A 實例)或某個對象的引用為const(const A& test = A實例) ,則返回值具有const屬性,則返回實例只能訪問類A中的公有(保護)數據成員和const成員函數,并且不允許對其進行賦值操作,這在一般情況下很少用到。

[思考3]: 這樣定義賦值操作符重載函數可以嗎?
const A& operator=(const A& a);

四 類成員函數中const的使用

一般放在函數體后,形如:void fun() const;
如果一個成員函數的不會修改數據成員,那么最好將其聲明為const,因為const成員函數中不允許對數據成員進行修改,如果修改,編譯器將報錯,這大大提高了程序的健壯性。

五 使用const的一些建議

1 要大膽的使用const,這將給你帶來無盡的益處,但前提是你必須搞清楚原委;
2 要避免最一般的賦值操作錯誤,如將const變量賦值,具體可見思考題;
3 在參數中使用const應該使用引用或指針,而不是一般的對象實例,原因同上;
4 const在成員函數中的三種用法(參數、返回值、函數)要很好的使用;
5 不要輕易的將函數的返回值類型定為const;
6除了重載操作符外一般不要將返回值類型定為對某個對象的const引用;

第一篇:typedef struct與struct的區別

  • 基本解釋
  • typedef為C語言的關鍵字,作用是為一種數據類型定義一個新名字。這里的數據類型包括內部數據類型(int,char等)和自定義的數據類型(struct等)。

    在編程中使用typedef目的一般有兩個,一個是給變量一個易記且意義明確的新名字,另一個是簡化一些比較復雜的類型聲明。

    至于typedef有什么微妙之處,請你接著看下面對幾個問題的具體闡述。

  • typedef & 結構的問題
  • 當用下面的代碼定義一個結構時,編譯器報了一個錯誤,為什么呢?莫非C語言不允許在結構中包含指向它自己的指針嗎?請你先猜想一下,然后看下文說明:

    typedef struct tagNode
    {
     char *pItem;
     pNode pNext;
    } *pNode;

    答案與分析:

    1、typedef的最簡單使用

    typedef long byte_4;

    給已知數據類型long起個新名字,叫byte_4。

    2、 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;// ERRORS1 是一個類型

    S2.data = 5;// ERRORS2 是一個類型

    S3.data = 5;// OKS3是一個變量

    }

    另外,對與在結構中定義結構本身的變量也有幾種寫法

    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

    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=” <

    總結

    以上是生活随笔為你收集整理的typedef的用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 久久99婷婷| 一区二区三区不卡视频 | 日本裸体视频 | 免费日韩成人 | 少妇一级淫片免费看 | 欧美成年人视频 | 欧洲自拍一区 | 91大神在线免费观看 | www.av72| 欧美成人午夜剧场 | 国产美女在线精品 | 亚洲av日韩av不卡在线观看 | 狠狠操狠狠操狠狠操 | 国产香蕉在线 | 看毛片的网址 | 国产精选视频在线观看 | 国产精品国产一区二区三区四区 | 污污免费在线观看 | 国产成人精品免高潮在线观看 | 无码av天堂一区二区三区 | 国产欧美日韩综合精品一区二区三区 | 日本亚洲国产 | 好爽又高潮了毛片 | 欧美bbbbb | 国产精品啪啪啪视频 | 亚洲天堂一区二区三区四区 | 国产真实夫妇交换视频 | 成人性免费视频 | 午夜av一区二区三区 | 日本猛少妇色xxxxx | 午夜精品av | 99福利视频 | 呦呦精品| 国产精品视频麻豆 | 婷婷久久久久久 | 美女黄18以下禁止观看 | 色七七视频 | 国产又黄又猛视频 | 极品美女销魂一区二区三区 | 精品一区二区免费视频 | 日韩一级影院 | 黄网站在线免费 | 亚洲最大黄色 | 性欧美videos高清hd4k | 3d动漫精品啪啪一区二区三区免费 | 2020国产在线 | 欧美激情啪啪 | 欧美日韩tv| 99热这里只有精品18 | 91官网入口 | 大帝av| 永久中文字幕 | 小明成人免费视频 | 国产伦精品一区二区三区免.费 | 少妇婷婷| 国产在线观看不卡 | 熟妇五十路六十路息与子 | 国产成人无码网站 | 羞羞动漫免费观看 | 手机在线免费视频 | 亚洲av无码乱码国产精品fc2 | 黄色骚视频 | 美女大bxxxxn内射 | 玖玖视频国产 | aⅴ在线免费观看 | 欧美tv| 国产区视频在线观看 | 少妇被按摩师摸高潮了 | 欧美aa | 91九色视频| 色屁屁www | 豆花av在线 | 天天舔天天干 | 国产精品黄色网 | 日本性视频网站 | 快播视频在线观看 | 人妻洗澡被强公日日澡电影 | 探花av在线| 国产成年无码久久久久毛片 | 国产偷自拍| 久久国产精品久久久久久电车 | 黄色免费91 | 人妻夜夜爽天天爽 | 一区二区三区视频免费视 | 在线精品视频免费观看 | 国产精品毛片久久久 | 毛片视频网站 | 国产良妇出轨视频在线观看 | 舐丝袜脚视频丨vk | 国产精品无码一区二区三区免费 | 日韩中文字幕观看 | 一区二区三区在线视频观看 | 免费在线观看a级片 | 免费a v在线 | 久久欧美精品 | 日韩精品在线看 | 有码在线视频 | 性激情视频 | 欧美高清hd19 |