一個(gè)字節(jié)是八個(gè)比特钝域,所以int在內(nèi)存中占據(jù)32個(gè)比特
如果要輸出一個(gè)變量的地址應(yīng)該用%p
將i的地址取出來強(qiáng)制變?yōu)?int 類型,賦給 p 硕淑,其結(jié)果和直接取 i 地址出來是一樣的
這個(gè)結(jié)果是在32位的架構(gòu)下得出的
在64位架構(gòu)下sizeof(int)是4個(gè)字節(jié)
而sizeof(&i)這個(gè)地址取出來是8個(gè)字節(jié)
在32位架構(gòu)下sizeof(int)是4個(gè)字節(jié)
而sizeof(&i)這個(gè)地址取出來是4個(gè)字節(jié)
地址和整數(shù)并不永遠(yuǎn)相同浅蚪,這和我們用的架構(gòu)是有關(guān)的
&運(yùn)算符必須是對一個(gè)變量取地址皮胡,如果&右邊不是一個(gè)變量褐墅,則不能用&取地址
得有一個(gè)明確的變量才能對它取地址
68和6c在16進(jìn)制下相差4
在C語言中拆檬,存儲(chǔ)本地內(nèi)存的地方叫堆棧stack
存儲(chǔ)時(shí)是自上而下的,所以先定義的變量在上面
兩個(gè)數(shù)組單元之間的差距是4妥凳,而且相鄰的數(shù)組之間的差距永遠(yuǎn)是4
取地址后把地址交給一個(gè)整數(shù)竟贯,這種方法不見得正確
因?yàn)榈刂返念愋筒灰欢芎驼麛?shù)的類型對得上
一個(gè)指針類型的變量就是一個(gè)保存取出來的地址的變量
* 就代表著是一個(gè)指針
* p 就代表p是一個(gè)指針,它指向的是這個(gè)int猾封,現(xiàn)在我們把這個(gè) i 的地址交給了這個(gè) p
p 里面的值是 i 的地址澄耍,這時(shí)候我們就說 p 指向了 i
這兩行的意思是一樣的噪珊,都是定義了一個(gè)指針 *p 和一個(gè)普通的 int 型變量 q
我們并不是把 * 加給了 int 我們是把 * 加給了 p
在C語言中并沒有 int* 這種類型
若要表達(dá) p 和 q 都是指針晌缘,則要寫成 int *p,*q痢站;
指針變量里面只會(huì)有別的變量的地址而不是別的變量的值
p 指向 i 磷箕,說明 p 能訪問 i ,訪問即可以對 i 進(jìn)行讀和寫
而如果只是普通的變量賦值阵难,則得到的是 i 中的值岳枷,而不能對 i 產(chǎn)生什么影響
此時(shí) *p 作為一個(gè)整體它是一個(gè)整數(shù)
在經(jīng)歷了f函數(shù)之后, i 的值被改了
p 的值是 i 的地址, *p 就代表了 i 空繁,所以我們能修改 i 的值
scanf以為輸入的就是一個(gè)地址殿衰,所以編譯不一定會(huì)出錯(cuò),但是運(yùn)行一定會(huì)出錯(cuò)
因?yàn)閟canf把值寫到了 6 那個(gè)地方盛泡,而那個(gè)地方很小闷祥,而且有很重要的東西
其實(shí)在函數(shù)里面的數(shù)組就是指針
不是說這兩種類型是等價(jià)的,而是說它們在參數(shù)表中出現(xiàn)的出現(xiàn)的時(shí)候是等價(jià)的
p [0] 是指它所指向的值作為數(shù)組第一個(gè)位置的值
一個(gè)數(shù)組變量是一個(gè)常量指針傲诵,所以這個(gè)數(shù)組變量不能被賦值凯砍,兩個(gè)數(shù)組變量之間也不能相互做賦值