3.從安全性來說,操作不當時數組會造成越界,野指針會造成內存洩漏。
4.從函數形參來說,傳一維數組用元素指針,傳二維數組用一維數組指針,以此類推;傳指針用指針的指針。
5.從處理對象來說,數組偏向於值的處理,指針偏向於計算機地址的處理。
6.從空間連續性來說,數組對應的空間一定是連續的,指針指向的空間不一定是連續的。
2.內存雖然分配成功,但使用前沒有初始化
3.內存分配成功且正確初始化,但操作越界了
4.使用完以後沒有釋放內存,造成內存洩漏
5.使用了已經釋放的內存
提高了代碼的復用性、維護性、可擴展性
*函數的三要素:函數名,形參,返回值
1.函數名
*函數名要起到自注釋性,提高代碼的可讀性
*下劃線連接的字符不能超過5個,通常用簡易的動詞加名詞
*函數名即函數的存儲地址,也是函數的入口地址
*執行函數的過程
①根據函數名找到函數的入口地址
②給函數形參分配空間
③傳值:把實參對應的內存空間的值傳給形參
④執行函數裡面的語句
2.形參
*如何確定傳值還是傳地址
①當要修改實參變量的值,就要傳地址
①當只要使用實參變量的值,只要傳值
*傳入參數、傳出參數
傳入參數:原本沒有值,通過調用函數,帶出變量的值
傳出參數:原本有值,通過調用函數來使用該值
3.返回值
*函數返回值不要使用局部變量的地址
[code]char * func() { char *ptr = "hello"; char src[100] = "hello"; return ptr;//能正常輸出,因為ptr中保存的是字符常量'h'的地址,所以不會被釋放 //return src; //不能正常輸出,因為src中保存的是局部變量的地址 }*當程序出現異常,要拋出異常,並給出提示信息
①exit(1);給用戶反饋,異常退出;結束時返回值為1,可以自定義;該函數包含在stdlib.h這個頭文件中;功能是結束整個程序。
②return 0;給系統的反饋;系統檢查程序是否是正常退出,用return 0;
*用 echo $? 相當於 printf當前程序的返回值;例,exit(1); 輸出的值就為 1 。
[code]#include<stdio.h> int add(int a,int b) { return a + b; } int sub(int a,int b) { return a - b; } int mul(int a,int b) { return a * b; } int cal(int (*func)(int,int),int a,int b) { return func(a,b); } int main() { int a = 5; int b = 6; int result; int (*func_arr[3])(int,int); //函數指針數組,保存多個函數的地址 int (*p_func)(int,int);//函數指針 p_func = add;//該函數指針裡面保存的是add函數的地址 result = p_func(a,b); printf("result = %d\n",cal(add,a,b)); /*分別為函數指針數組裡面的每個元素賦值*/ func_arr[0] = add; func_arr[1] = sub; func_arr[2] = mul; int i; /*輸出函數指針數組每個函數指針指向的函數的返回值*/ for(i = 0;i < 3;i++) { printf("func_arr[%d] = %d\n",i,func_arr[i](a,b)); } result = cal(add,a,b);//此處的add可以換為mul、sub等。這些函數稱為回調函數 printf("result = %d\n",result); return 0; }
*回調函數
函數指針做形參,這個函數指針指向的函數稱為回調函數
*argv[]:保存參數的數組
[code]#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { /*此時有且只能輸入一個真正的參數*/ if(argc != 2) { printf("please input one param!\n"); exit(1); } printf("argc = %d\n",argc); int i; /*打印所有參數*/ for(i = 0;i < argc;i++) { printf("argv[%d] = %s\n",i,argv[i]); } return 0; }