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/