當前位置:首頁 > 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|中文字幕亚洲无线码