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介面,幷包含其他的功能,比如 增加元素,替換元素,獲取前乙個和後乙個元...