c語言專題

2021-06-29 13:20:10 字數 3386 閱讀 4089

本篇作為乙個引子,領著大家梳理c語言中難點或容易忽視的知識點,知識點以專題形式展開。

專題一 結構占用記憶體長度

在linux/windows上執行下面一段程式,你能總結出struct記憶體對齊規則嗎?

struct ta ;

struct tb ;

struct tc ;

printf("size ta:%d tb:%d tc:%d\n", sizeof(struct ta), sizeof(struct tb), sizeof(struct tc));

參考分析:struct記憶體總是以其l最長記憶體佔位元組成員a為基準來對齊的,如果a後面相鄰成員所佔記憶體位元組和小於或等於nl(n為正整數)則記憶體拼接,

其中sizeof(long)結果取決於作業系統和cpu結構,各作業系統和cpu架構下sizeof(long)建議值如下表:

os arch size

windows ia-32 4 bytes

windows intel 64 4 bytes

windows ia-64 4 bytes

linux ia-32 4 bytes

linux intel 64 8 bytes

linux ia-64 8 bytes

mac os x ia-32 4 bytes

mac os x intel 64 8 bytes

(詳見:

假設改程式執行於linux ia-64上則結果為:

size ta:24 tb:12 tc:6

專題二 指標和陣列

執行下面程式,觀察陣列array位址&array輸出結果,另外觀察程式中指標的宣告,你能學到什麼?

int g_array = ;

int func1(int a)

int func2(int a)

int (*func3(int array[4]))[9]

char *const

*func4()

void addr1(int array)

void addr2(int

*array)

int main()

; int( *p)[4] = &array;

int (*pfunc)(int) = ;

printf("%d, %d, %d\n", (*p)[1], pfunc[1](3),

(*func3(array))[1]);

addr1(array);

addr2(array);

printf("%#x

%#x%#x

%#x\n", array, &array,

&array[0], &array[1]);

addr1(g_array);

addr2(g_array);

printf("%#x

%#x%#x

%#x\n", g_array, &g_array,

&g_array[0], &g_array[1]);

char * const *(

*next)() = func4;

return

0;}

參考分析:

gcc編譯器輸出:

func2 be called

2, 3, 3

bfe69a68 bfe69a40 bfe69a68 bfe69a6c

bfe69a6c bfe69a40 bfe69a6c bfe69a70 bfe69a6c

0xbfe69a68 0xbfe69a68 0xbfe69a68 0xbfe69a6c

80498c0 bfe69a40 80498c0 80498c4

80498c4 bfe69a40 80498c4 80498c8 80498c4

0x80498c0 0x80498c0 0x80498c0 0x80498c4

llvm編譯器輸出:

func2 be called

2, 3, 3

5e72ebf0 5e72eb88 5e72ebf0 5e72ebf4

5e72ebf0 5e72eb88 5e72ebf0 5e72ebf4 5e72ebf4

0x5e72ebf0 0x5e72ebf0 0x5e72ebf0 0x5e72ebf4

14d2040 5e72eb88 14d2040 14d2044

14d2040 5e72eb88 14d2040 14d2044 14d2044

0x14d2040 0x14d2040 0x14d2040 0x14d2044

gcc、llvm對printf(「%x %x %x %x %x\n」, array, &array, &array[0], &array[1], ++array);這行處理不同,

你觀察到了吧,另外還有四個有趣的問題:

1.addr1、addr2中array!= &array,main函式中array == &array。

(陣列作為函式引數在函式內被轉化為指向陣列首位址的指標,對指標取位址就是另外的值了)

2.gcc執行這行(++array後),&array卻沒有變。

3.func2 be called卻最先列印。

4.函式中涉及到的指標

int (*pfunc)(int);//指向函式陣列的指標

int (*func3(int array[4]))[9];//函式指標,其形參為int [4], 返回長度為9的int指標向量(等價於int [9])

int( *p)[4];//長度為4的int指標向量,可以這麼使用,

int a[4] = , };

int (*p)[4] = a;

printf(「%d, %d, %d\n」, p[0][1], (p)[1], ((p + 1))[1]);//結果:2, 2, 6

專題三 switch - case容易忽視的細節

下面這段程式結果是什麼?

int main()

printf("a:%d\n", a);

return

0;}

專題四 typedef用法要訣

初識typedef你是否不知所云,那麼請往下看。

語法:typedef 變數宣告

變數名字即代表所宣告的型別,例如,typedef char t[2], t t[3]為乙個3行2列的二維陣列,

又如,

typedef

struct student student_t;

student_t zhangsan;等價於 struct student zhangsan;

c語言 Const專題

const 專題 intmain 和 的作用是一樣的 不能隨便修改 的值 const 放在 的左邊,修飾的是指標 中儲存的位址所指向的記憶體空間,是指指標 中所儲存的位址所指向的記憶體空間不可被寫,只可被讀 const 放在 的右邊邊,修飾的是指標 中儲存的位址,是指指標 中所儲存的位址不可改變,但...

C語言 陣列專題

青島科技大學資訊科學技術學院軟體15級2015 2016學年第一學期學習了如下課程 軟體技術導論 2學分 c語言程式設計 3.5學分 高等數學 5學分 體育 2學分 英語 3學分 中國革命史 2學分 6門課程,為了對學生的考試成績進行分析 統計 排名 學分等進行有效管理,結合學生的學號 姓名 學年度...

C語言指標專題 序

小魚的技術部落格,主談c語言程式設計,順便談談人生,談談理想,關注熱鏈 我的csdn技術部落格 看到好多的c語言初學者學到指標時,都覺得指標怎麼那麼難啊!我也想起了我當時學習指標時遇到的困難,確實很難!到底是教程寫的不好呢,還是老師教的不好呢?我覺得都有。網上搜尋指標講解的資料很多,我也看了不少,不...