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