程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 一起talk C栗子吧(第九十 二回:C語言實例

一起talk C栗子吧(第九十 二回:C語言實例

編輯:關於C
各位看官們,大家好,上一回中咱們說的是數組大小的例子,這一回咱們說的例子是:淺談typedef。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

最近有看官問一些關於typedfe的問題,我在這裡專門做一個說明,希望對大家有幫助。

typedef是C語言的一個關鍵字,用來重新定義類型通俗點說叫起別名或者起綽號也可以

typedef通常有兩個功能:

為了程序簡潔易懂(可讀性好);為了避免程序出錯;

簡潔易懂

關於簡潔易懂,我們舉一個例子:

typedef struct person
{
    int age;
    char *name;
    char flag;
}Person;

在例子中定義了一個新的類型:Person.它和struct person的效果相同,在下面的代碼中

Person p1;              //定義一個結構體變量
struct person p1;      //定義一個結構體變量

在上面的例子中Person p1; 等價於 struct person p1.但是前面的寫法更加簡潔一些。

還記得是我們在前面的章回中介紹過後的函數;signal嗎?下面是signal函數的原型

void (*signal(int signo, void (*func) (int))) (int)

我們可以定義一個新類型:

typedef void func (int);

它表示一個函數,該函數擁有一個int類型的參數,並且返回類型為void。定義好該類型後,函數signal的函數原型可以這樣寫:

func * signal (int signo, func *pFun);  //使用typedef定義新類型後的signal函數

現在的signal函數是不是簡潔很多呢。

避免出錯

關於避免程序出錯,我們也舉一個例子:

#include 

int main()
{
    int *p1,p2;

    int a,b;
    a = 3; 
    b = 5;

    p1 = &a;
    p2 = &b;

    printf("a = %d \n",*p1);
    printf("b = %d \n",*p2);

    return 0;
}

編譯上面的程序會有編譯警告和錯誤出現:

In function ‘main’:
typFile.c:12:5:
 warning: assignment makes integer from pointer without a cast [enabled by default]
  p2 = &b;                  //發出警告
typFile.c:15:21: error: invalid type argument of unary ‘*’ (have ‘int’)
  printf("b = %d \n",*p2);  //編譯錯誤

其實我們是想定義兩個int類型的指針,結果定義了一個指針,一個變量,為了避免這種錯誤,我們可以在程序中使用typedef來定義一個指針類型。具體如下:

#include 

typedef int * pInt;            //定義一個新的指針類型

int main()
{
    pInt p1,p2;                //使用新類型定義兩個指針

    int a,b;
    a = 3; 
    b = 5;

    p1 = &a;
    p2 = &b;

    printf("a = %d \n",*p1);
    printf("b = %d \n",*p2);

    return 0;
}

編譯該程序,剛才的警告和錯誤沒有了,我們運行編譯後的程序可以得到以下結果:

a = 3 
b = 5           //程序運行正確

各位看官,關於淺談typedef的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。

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