歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux C第七課

指針與數組的區別

1.從空間分配來說,數組是靜態分配,指針式動態分配。 2.從訪問效率來說,數組是直接訪問,訪問效率高;指針是間接訪問,效率低。

3.從安全性來說,操作不當時數組會造成越界,野指針會造成內存洩漏。

4.從函數形參來說,傳一維數組用元素指針,傳二維數組用一維數組指針,以此類推;傳指針用指針的指針。

5.從處理對象來說,數組偏向於值的處理,指針偏向於計算機地址的處理。

6.從空間連續性來說,數組對應的空間一定是連續的,指針指向的空間不一定是連續的。

常見的內存錯誤及對策

(我們常用printf、gdb來調試內存錯誤) 1.內存分配未成功,卻使用了

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;
}

*回調函數

函數指針做形參,這個函數指針指向的函數稱為回調函數

主函數參數

*主函數參數也稱為命令行參數 *argc:參數的個數;實際參數的個數 argc - 1,因為系統將./a.out 也作為一個參數,而真正的參數只有 argc - 1個

*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;
}

Copyright © Linux教程網 All Rights Reserved