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/