-
將str指針往下移了三個(gè),將hello中第二個(gè)l替換為\0,將字符串提前結(jié)束
查看全部 -
int *p=&a:定義的指針p是整型數(shù)據(jù),p++之后,p中的地址就會(huì)增加4個(gè)字節(jié)。
這就是指針偏移運(yùn)算,這種方式比CPU直接取地址效率還要高,所以設(shè)計(jì)程序都會(huì)盡可能地采取這種方式。
p+=3:將指針向下移動(dòng)3格,如果p是整型,就移動(dòng)12個(gè)字節(jié)。(等價(jià)于p[3])
數(shù)組和指針的本質(zhì)都是地址,所以*pa=array,相當(dāng)于將array數(shù)組的地址賦值給pa指針,這樣pa[1]的功能和array[1]的功能就沒有區(qū)別了。
數(shù)組是指針常量,
指針是指針變量,
指針能實(shí)現(xiàn)數(shù)組的功能,但是數(shù)組不一定能實(shí)現(xiàn)指針的功能。
arry+=2會(huì)報(bào)錯(cuò)查看全部 -
gdb命令:
x/3d? 地址:按照十進(jìn)制d,連續(xù)顯示3個(gè)(3)變量的地址(x),默認(rèn)間隔為4個(gè)空格查看全部 -
“p”是一個(gè)地址,則“*p”是到這個(gè)地址去取里面的值,“(*p)”表示為一個(gè)整體,“(*p)(數(shù)據(jù))”若p為代碼段,則調(diào)用這個(gè)函數(shù),傳參數(shù)"數(shù)據(jù)"進(jìn)去
查看全部 -
最下面的內(nèi)存最先分配
最先分配的棧地址反而更大
棧的特點(diǎn):先進(jìn)后出
靜態(tài)變量不在棧里頭,相同變量名稱的靜態(tài)變量分別在兩個(gè)函數(shù)里便為兩個(gè)不同變量,屬于每個(gè)函數(shù)特有的;
全局變量為所有函數(shù)公用的。其地址不變。
一個(gè)函數(shù)被多次調(diào)用時(shí),靜態(tài)變量指向的還是數(shù)據(jù)段一個(gè)固定的地址;即不同函數(shù)的count是不同的count,但同一個(gè)函數(shù)不管調(diào)用多少次count,它指向的都是數(shù)據(jù)段的某個(gè)地址。查看全部 -
無&符,輸出變量值
有該符,輸出地址
查看全部 -
變量名只是代號(hào),變量的本質(zhì)是內(nèi)存;
在標(biāo)準(zhǔn)的C語言中,不允許直接對(duì)內(nèi)存地址進(jìn)行操作,只能是對(duì)操作系統(tǒng)已經(jīng)分配給的內(nèi)存空間進(jìn)行操作。
int *p=&a;??? p 指針指向的變量地址; *p? 指針指向的變量值; &p 指針自己所在的地址。既然一個(gè)指針保存的是變量的地址,對(duì)32位CPU,地址有4個(gè)字節(jié),就需要4個(gè)內(nèi)存單元來存儲(chǔ),所以每次++p在內(nèi)存里都是跳4格。
函數(shù)調(diào)用信息保存在棧(stack)中。 int *pa=&a指將a的地址傳給pa。因此p pa看到的是a的地址(&a)。 而p &pa才能看到pa本身的地址。查看全部 -
代碼段放編譯后的程序,數(shù)據(jù)段放常量、變量,中間的綠色是自由可分配空間。查看全部 -
0x表示十六進(jìn)制
查看全部 -
加了地址符后的a表示一個(gè)地址,*a是去找到該地址下對(duì)應(yīng)的值
可以看出0中a為地址,需*a找到對(duì)應(yīng)值
1中a為確切值
查看全部 -
gdb?? -help完整顯示各種用法
(gdb)start? 開始執(zhí)行
紅框?yàn)樽詣?dòng)設(shè)置的斷點(diǎn)為12行處(gdb) p a
分別為printf a?? 即為輸出變量a
(gdb)? n
為換到下一行(gdb)? bt?? 查看函數(shù)堆棧
堆棧像書,摞在上面先執(zhí)行(gdb) f 1
f為切換棧,即切換到棧1
單用change,由于形參,兩個(gè)函數(shù)中a.b不同,無法改變--所以需要指針
查看全部 -
*a?? 表指針
&a? 取地址查看全部 -
注意:這里偏移三格指向arrary[0]是因?yàn)橹虚g有一個(gè)變量i,然后是b,然后才是array[0],而不是array[1]查看全部
-
指針變量上加*表示:打印其保存的地址指向的值查看全部
-
不帶&符號(hào):打印變量里面的值
否則:打印變量的地址查看全部
舉報(bào)
0/150
提交
取消