牛客 題庫 define typedef 區別

2021-08-07 22:47:21 字數 1949 閱讀 4136

1.test.c檔案中包括如下語句:

#define int_ptr int*

typedef int*int_ptr;

int_ptr a,b;

int_ptr c,d;

檔案中定義的四個變數,哪個變數不是指標型別?

解答:b

typedef :給已有型別宣告乙個別名,故c和d都是int_ptr型別也即都是int *型別

#define巨集定義,在預編譯時直接進行

簡單替換,即

原式變為:int* a,b; 這相當於是int *a, int b;

即a是指標,b是int型

1、巨集定義

時若巨集體表示式沒有

括號約束

,就應特別注意其替換後是否會出錯;

#define  fun(a,b)  a+b   

...int tmp = fun(2,3) * 4; // 本意是(2+3)*4,結果卻變成了int tmp = 2+3*4; tmp變為14;故應改為#define fun(a,b) (a+b)

2、關於

把空格寫在型別修飾符和變數名中間

int* p; // 合法但容易產生誤導

誤導即:int* 放在一起好像是這條語句中所有變數共同的型別一樣。其實恰恰相反,基本型別是int 而非int*。 *僅僅是修飾了p而已,對該宣告語句中其他變數,它並不產生任何作用。

int* p1, p2; // p1是指向int的指標,p2是int

涉及指標或引用的宣告的兩種寫法

,第一種是把修飾符和變數標識寫在一起:

int *p1, *p2; // p1和p2都是指向int的指標

這種形式強調制數具有的復合型別;

第二種把修飾符和型別名寫在一起,並且記住每條語句只定義乙個變數:

int* p1; // p1是指向int的指標

int* p2; // p2是指向int的指標

這種形式著重

強調本次宣告定義了一種復合型別

3.網上找到一篇講解t

ypedef 非常詳細的部落格:

關於typedef的用法總結

typedef為

c語言的關鍵字,

作用是為一種資料型別定義乙個新名字

。這裡的資料型別包括內部資料型別(int,char等)和自定義的資料型別(struct等 )

。 在程式設計中使用typedef目的一般有兩個,

乙個是給變數乙個易記且意義明確的新名字,另乙個是簡化一些比較複雜的型別宣告。

typedef 行為有點像 #define 巨集,用其實際型別替代同義字。不同點是 typedef 在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文字替換。

定義一種型別的別名,而不只是簡單的巨集替換。可以用作同時宣告指標型的多個物件。比如:

char* pa, pb; // 這多數不符合我們的意圖,它只宣告了乙個指向字元變數的指標,  

// 和乙個字元變數;

以下則可行:

typedef char* pchar;  

pchar pa, pb;

這種用法很有用,特別是char* pa, pb的定義,初學者往往認為是定義了兩個字元型指標,其實不是,而用typedef char* pchar就不會出現這樣的

問題,減少了錯誤的發生。

牛客 題庫 1

1.字串複製函式strcpy 字元陣列1,字元陣列2 字元陣列1的長度應大於等於字元陣列2的長度.說法是否正確?解答 說法正確 strcpy函式 顧名思義字串複製函式 原型宣告 char strcpy char dest,const char src 標頭檔案 include string.h 和 ...

牛客 題庫 遞迴

1.下列 的輸出是?注 print已經宣告過 main print char s 解答 輸出的是 suiene 注意,字母前面有乙個空格 這裡考察了兩個知識點 遞迴和print s 指標先移動,然後呼叫函式。找到一篇講解遞迴的部落格 遞迴演算法 程式呼叫自身的程式設計技巧稱為遞迴 recursion...

牛客網 java題庫(21 30)

literator可用來遍歷set和list集合,但是listlterator只能用來遍歷list。iterator對集合只能是前向遍歷,listiterator既可以前向也可以後向。listiterator實現了iterator介面,幷包含其他的功能,比如 增加元素,替換元素,獲取前乙個和後乙個元...