當(dāng)前位置:首頁 > IT技術(shù) > 編程語言 > 正文

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

05_0000 5.0 星仔為指針作序

內(nèi)存的本質(zhì)是什么?

小明為什么要保存一部分內(nèi)存供自己使用?

什么是虛擬地址?


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

05_0100 5.1 指針與地址

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

你應(yīng)該在指針里存放地址信息,但,實(shí)際上,你存放什么都無所謂, 只是*p可能會(huì)掉進(jìn)坑里

地址是什么?
地址就是線性內(nèi)存的每一個(gè)單元的編號(hào).

指針在計(jì)算機(jī)的內(nèi)存里,地址在人的腦海里.


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


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

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

05_0200 5.2 指針與函數(shù)參數(shù) 傳參數(shù)本質(zhì)

什么是傳值的方式傳遞參數(shù)

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

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

05_0201 5.2 指針與函數(shù)參數(shù)

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

05_0300 5.3 指針與數(shù)組

數(shù)組與指針的區(qū)別
1.指針是一個(gè)變量, 而數(shù)組標(biāo)號(hào)是一個(gè)常量
? ? ? ? a). 指針可以用&符號(hào)取地址,而數(shù)組標(biāo)號(hào)是不能用&符號(hào)
? ? ? ? b).指針可以被賦值,而數(shù)組標(biāo)號(hào)不能被賦值
2.sizeof的值不同,對(duì)于指定的編譯環(huán)境,sizeof(指針)是定值, sizeof(數(shù)組)取決您, 您告訴它有多長(zhǎng),它就認(rèn)為有多長(zhǎng)

數(shù)組的長(zhǎng)度
1.數(shù)組的長(zhǎng)度取決于您, 您告訴它有多長(zhǎng),它就認(rèn)為有多長(zhǎng)
2.當(dāng)函數(shù)參數(shù)是數(shù)組時(shí), 數(shù)組退化成指針 (附證明)

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

擴(kuò)展
只要您確定訪問的內(nèi)存有效,數(shù)組就能越界


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

05_0400 5.4 地址算術(shù)運(yùn)算


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

指針的運(yùn)算,說直白點(diǎn),就是地址值的運(yùn)算,只要有道理,你怎么操作都行

內(nèi)存對(duì)齊與非常有用的ptrdiff_t
用于兼容32位和64位cpu

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

方法二:
#pragma pack (push,1) 作用:是指把原來對(duì)齊方式設(shè)置壓棧,并設(shè)新的對(duì)齊方式設(shè)置為一個(gè)字節(jié)對(duì)齊
#pragma pack(pop) 作用:恢復(fù)對(duì)齊狀態(tài)


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

05_0500 5.5 字符指針與函數(shù)

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


*s++與*--p的意思
用執(zhí)行結(jié)果來查看其意思,如果考試需要,請(qǐng)記住

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

05_0600 5.6 指針數(shù)組以及指向指針的指針

指針是變量
指針在計(jì)算機(jī)的內(nèi)存里,地址在人的腦海里.

何為指針: 指針是變量,使用的時(shí)候會(huì)加載到內(nèi)存里,可以對(duì)其求地址
何為地址: 地址是客觀存在的,學(xué)習(xí)C語言,腦海中要有地址的概念

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

05_0700 5.7 多維數(shù)組

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

多維數(shù)組作為函數(shù)參數(shù)
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程序內(nèi)存布局

環(huán)境變量PATH舉例
windows下修改環(huán)境變量: 高級(jí)系統(tǒng)設(shè)計(jì)->高級(jí)->環(huán)境變量
linux下修改環(huán)境變量: export PATH=/home/uxingzaicpp/tmp4del/123PATH

參數(shù)arg


C程序內(nèi)存布局

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

05_0801 5.8 指針數(shù)組的初始化 5.9 指針與多維數(shù)組

5.8 指針數(shù)組的初始化

5.9 指針與多維數(shù)組
矩陣下標(biāo)的計(jì)算公式: 列寬*row + col

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

05_0900 5.10 命令行參數(shù)


char **argv 與 char* argv[] 作為函數(shù)參數(shù)等價(jià),正如char* s與char s[]一樣

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

? ? ? ? char** q = v;

? ? ? ? //對(duì)比q講解argv
} ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ??

解釋 *++argv (*++argv)[0] *++argv[0]
[]與操作數(shù)結(jié)合的優(yōu)先級(jí)比*和++高

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

05_0901 5.10 命令行參數(shù) - 練習(xí)

編寫程序expr

編寫程序tail

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

05_1000 5.11指向函數(shù)的指針

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

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

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

05_1001 5.11指向函數(shù)的指針 - 練習(xí) 5.12復(fù)雜聲明的前5個(gè)例子

逆序排序


不區(qū)分大小寫排序


指向二維數(shù)組的指針

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

?

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

開通會(huì)員,享受整站包年服務(wù)立即開通 >