C语言——数组、函数、指针
C語言——數組、函數、指針
宗旨:技術的學習是有限的,分享的精神是無限的。
1、有什么作用?為什么要使用它們?
(1)數組:提供一段連續的存儲空間,存數據和字符串很方便;
(2)函數:模塊化程序的設計(返回值和參數);
(3)指針:使用靈活;
?
2、數組的內存布局
【數組和鏈表區別:數組順序存儲,大小固定;鏈表隨機存儲,大小不定?!?/p>
int a[5];?--- a作為右值時,代表數組首元素的首地址,而非數組的首地址
//分配了20字節的空間名字為a, a[0], a[1]為a的元素,并非元素的名字。只給數組取名,沒給元素取名。
sizeof(a) ??--- ?sizeof(int) * 5 ?---?20
sizeof(a[0])?--- ?sizeof(int) ?--- ?4
sizeof(a[5])?--- ?sizeof(int) ?--- ?4 ? 并沒出錯,關鍵字求值是在編譯的時候,雖不存在a[5],但這里并未真正訪問a[5]。
sizeof(&a[0])--- ?4
sizeof(&a)--- ?4
&a[0]和&a ----?&a[0]代表數組首元素的首地址,&a是數組的首地址;值一樣,意義不同。
?
? 右值:出現在“=”右邊的值; 左值:出現在“=”左邊的值。
? a不能作為左值
初始化數組:memset(a,0, sizeof(a)); // 初始化為0
?
3、指針數組/數組指針,指針函數/函數指針
指針數組:int*a[10]; ? --- 實質就是個數組,只不過數組里面的元素全是指針。
數組指針:int(*a)[10]; --- 實質就是個指針,指向一個數組。
指針函數:int*a(int b, int c); ?--- 這就是個普通的函數,只不過返回值是int*類型的。
函數指針:int(*a)(int b, int c); --- a是個函數指針,指向一個函數,b,c是函數的參數,返回值為int【a = fun;】。
【typedefint (*potion_t)(int a, int b) --- potion_t相當于一個類型,可以直接用potion_t定義一個變量,只不過這個變量指向一個函數】
?
4、值傳遞和地址傳遞
值傳遞過程中,被調函數的形參作為被調函數的局部變量處理,即在內存的棧中開辟空間以存放由主調函數放進來的實參的值,從而成為了實參的一個拷貝。值傳遞的特點是被調函數對形參的任何操作都是作為局部變量進行,不會影響主調函數的實參變量的值。
而在地址傳遞過程中,被調函數的形參雖然也作為局部變量在堆棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參的任何操作都被處理成間接尋址,即通過堆棧中存放的地址訪問主調函數中的實參變量。正因為如此,被調函數對形參做的任何操作都影響了主調函數中的實參變量。
?
5、菜單界面的設計
菜單一-- 菜單二-- 菜單三-- 菜單四-- 菜單
? /* 將菜單的屬性和操作“封裝”在一起 */?
#define MENUNUM 10; typedef struct tag_sysmenu {char *text; /* 菜單的文本 */char xpos; /* 菜單在LCD上的X坐標 */char ypos; /* 菜單在LCD上的Y坐標 */void (*on_ok_fun)(); /* 在該菜單上按下OK鍵的處理函數 */void (*on_cancel_fun)(); /* 在該菜單上按下cancel鍵的處理函數 */ } sys_menu_t, *lpsys_menu_t;static sys_menu_t menu[MENUNUM] = {{"menu1", 0, 48, menu1on_ok, nemu1on_cancel},{"menu2", 7, 48, menu2on_ok, nemu2on_cancel},{"menu3", 7, 48, menu3on_ok, nemu3on_cancel},{"menu4", 7, 48, menu4on_ok, nemu4on_cancel}... };? OK和Cancel鍵的處理變成:
void onok_key() {menu[currentFocusMenu].on_ok_fun(); } void on_cancel_key() {menu[currentFocusMenu].on_cancel_fun(); }?
總結
以上是生活随笔為你收集整理的C语言——数组、函数、指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: isfull mysql_MySQL数据
- 下一篇: argv python 提示输入_Pyt