• 當前位置:首頁 > IT技術 > 編程語言 > 正文

    《跟著星仔學C語言》第五章 指針與數組
    2022-09-06 22:40:04

    05_0000 5.0 星仔為指針作序

    內存的本質是什么?

    小明為什么要保存一部分內存供自己使用?

    什么是虛擬地址?


    https://www.bilibili.com/video/BV12L4y1Y76R?p=37

    05_0100 5.1 指針與地址

    指針是什么?
    指針是一個變量,用來告訴編譯器預留多少空間給他, 和char short long long long 并沒有本質區別.(這也是定義變量的本質)
    指針的sizeof大小由它能訪問的內存空間大小決定

    你應該在指針里存放地址信息,但,實際上,你存放什么都無所謂, 只是*p可能會掉進坑里

    地址是什么?
    地址就是線性內存的每一個單元的編號.

    指針在計算機的內存里,地址在人的腦海里.


    指針的類型有什么用?
    1.確定p++或者p--一次跳的格子數(由編譯器完成)
    2.確定*p訪問的內容大小
    3.和指針自身的大小沒有關系


    指向指針的指針?
    這只是一個理解問題,只有理解了,才知道這么繞口到底說的什么玩意

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=38

    05_0200 5.2 指針與函數參數 傳參數本質

    什么是傳值的方式傳遞參數

    int swap(int* px, int* py)是傳值方式傳遞參數嗎?

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=39

    05_0201 5.2 指針與函數參數

    講解getint與getfloat
    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=40

    05_0300 5.3 指針與數組

    數組與指針的區別
    1.指針是一個變量, 而數組標號是一個常量
    ? ? ? ? a). 指針可以用&符號取地址,而數組標號是不能用&符號
    ? ? ? ? b).指針可以被賦值,而數組標號不能被賦值
    2.sizeof的值不同,對于指定的編譯環境,sizeof(指針)是定值, sizeof(數組)取決您, 您告訴它有多長,它就認為有多長

    數組的長度
    1.數組的長度取決于您, 您告訴它有多長,它就認為有多長
    2.當函數參數是數組時, 數組退化成指針 (附證明)

    exe的生成的過程
    1.C語言預處理(比如宏替換)
    2.單獨編譯每一個文件,生成.obj(linux下是.o)文件 ? ?(sizeof是在這個階段計算的)
    3.把所有的.obj文件link成一個exe

    擴展
    只要您確定訪問的內存有效,數組就能越界


    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=41

    05_0400 5.4 地址算術運算


    既然sizeof(char*)/sizeof(short*)/sizeof(int*)/sizeof(long long*)....的值都一樣,那還要指針類型做什么?
    舉例:
    學生* p; p++表示訪問下一個學生
    班級* p; p++表示訪問下一個班級
    年級* p; p++表示訪問下一個年級
    學校* p; p++表示訪問下一個學校
    這些操作是由編譯器完成的
    C語言保證, 0永遠不是有效的數據地址
    指針與整數之前不能直接轉換,但0(NULL)是個例外

    指針的運算,說直白點,就是地址值的運算,只要有道理,你怎么操作都行

    內存對齊與非常有用的ptrdiff_t
    用于兼容32位和64位cpu

    1字節對齊的方法
    方法一:
    #pragma pack (n) 作用:C編譯器將按照n個字節對齊。
    #pragma pack () 作用:取消自定義字節對齊方式。

    方法二:
    #pragma pack (push,1) 作用:是指把原來對齊方式設置壓棧,并設新的對齊方式設置為一個字節對齊
    #pragma pack(pop) 作用:恢復對齊狀態


    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=42

    05_0500 5.5 字符指針與函數

    char amsg[]與char*pmsg的區別
    1.amsg指向的地址位于堆棧之內
    2.pmsg指向的地址位于堆棧之外
    3.字符串常量可讀,是否可寫是未定義的
    4.字符串常量可用于函數返回值,但局部變量字符串數組就不可以了(事實證明)
    s與*(s+i)的效率之差


    *s++與*--p的意思
    用執行結果來查看其意思,如果考試需要,請記住

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=43

    05_0600 5.6 指針數組以及指向指針的指針

    指針是變量
    指針在計算機的內存里,地址在人的腦海里.

    何為指針: 指針是變量,使用的時候會加載到內存里,可以對其求地址
    何為地址: 地址是客觀存在的,學習C語言,腦海中要有地址的概念

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=44

    05_0700 5.7 多維數組

    多維數組在內存中的表現形式
    定義數組的方法 變量名[行][列]
    char arr[2][3] = {'a','b','c','1','2','3'}; //2表示行,3表示列

    多維數組作為函數參數
    f(int daytab[2][13]) //OK
    f(int daytab[][13]) //OK
    f(int (*daytab)[13]) //OK
    int *daytab[13] //ERROR

    代碼:https://q1024.com/p/item.php?u=krc
    視頻:http://www.bilibili.com/video/BV12L4y1Y76R?p=45

    05_0800 C程序內存布局

    環境變量PATH舉例
    windows下修改環境變量: 高級系統設計->高級->環境變量
    linux下修改環境變量: export PATH=/home/uxingzaicpp/tmp4del/123PATH

    參數arg


    C程序內存布局

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=46

    05_0801 5.8 指針數組的初始化 5.9 指針與多維數組

    5.8 指針數組的初始化

    5.9 指針與多維數組
    矩陣下標的計算公式: 列寬*row + col

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=47

    05_0900 5.10 命令行參數


    char **argv 與 char* argv[] 作為函數參數等價,正如char* s與char s[]一樣

    int main(int argc, char* argv[])
    {
    ? ? ? ? char* v[] =
    ? ? ? ? {
    ? ? ? ? ? ? ? ? "myecho.exe",
    ? ? ? ? ? ? ? ? "hello,",
    ? ? ? ? ? ? ? ? "world",
    ? ? ? ? ? ? ? ? NULL,
    ? ? ? ? };

    ? ? ? ? char** q = v;

    ? ? ? ? //對比q講解argv
    } ? ? ? ? ? ? ? ? ? ? ? ?
    ? ? ? ? ? ? ? ? ? ? ? ??

    解釋 *++argv (*++argv)[0] *++argv[0]
    []與操作數結合的優先級比*和++高

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=48

    05_0901 5.10 命令行參數 - 練習

    編寫程序expr

    編寫程序tail

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=49

    05_1000 5.11指向函數的指針

    函數指針里存放的值不是函數地址,而一個跳轉指令
    這個跳轉指令,最終會跳到函數地址
    E9就是jmp:相對跳轉指令
    計算公式:E9后面的地址 = 目標地址 - 當前地址 - 5
    從指針說起
    1.定義一個指針變量,比如說int* a; 那么*a就可以改變指針a指向的地址的內容
    2.定義一個函數變量,比如說func f; 那么(*f)就可以調用f指向的內容的函數, *可以省略
    編寫程序tail

    函數指針類型和int a沒什么分別
    普通函數秒變函數指針類型

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=50

    05_1001 5.11指向函數的指針 - 練習 5.12復雜聲明的前5個例子

    逆序排序


    不區分大小寫排序


    指向二維數組的指針

    代碼:http://q1024.com/p/item.php?u=krc
    視頻:https://www.bilibili.com/video/BV12L4y1Y76R?p=51

    ?

    本文摘自 :https://www.cnblogs.com/

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码