struct stat st;
struct stat *st;
【就事論事的解釋】
struct stat *st;
是定義了乙個stat結構體的指標,
這句話的重點在於是「指標」,其本質上,(在32位的體系結構中)也就是乙個32位的數而已。
對於名稱和實體來說:
名稱:乙個名字叫做st指標
實體:記憶體裡面,也只有乙個32位的空間,來存放這個指標。
struct stat st;
定義餓了乙個stat型別的結構體,名字叫做st。
這裡的重點是「結構體」,其根據結構體具體定義的不同,占用不同的物理空間大小。
這裡的名稱和實體:
名稱,是乙個叫做st的結構體。
實體:就是乙個結構體,結構體有多大,st就占用了多大的物理空間。
也就是說,比如你的結構體很複雜,比如所有成員空間加起來,有80位元組,那麼,這個st實際就占用了80個位元組的大小。
【為何容易犯錯】
意思解釋完了,說一下為何會犯這樣的錯誤,
我們是定義了這個:
struct stat *st;
但是,實際只是定義所需要的結構體的指標,而不是實際結構體本身。
舉個例子,結構體好比是乙個房間。
不同型別的房間大小不同,占用的物理空間也不一樣。
結構體的指標,好比乙個房間的一把鑰匙。
不論其所相關的房間的大小,鑰匙,始終只佔鑰匙這麼大一點的空間(預設,可以理解為4個位元組,32位)。
我們之所以犯這樣的錯,歸根結底,都是太「貪」了,以後弄了個指標(鑰匙),系統就會自動給你分配好了,
指標所指向的東西(別人就會給你個房子。。。)。
【引申】
以後不論你在別處再看見類似的指標,
不管這把鑰匙可以開的是,乙個小房間,還是一棟別墅,還是乙個汽車,還是乙個玩具車,
它都只是一把鑰匙而已,只是這麼大而已。物理上分配的空間也都是32位而已。
記住,如果你沒有得到其他的房子或汽車,而只是弄了把鑰匙。除非你買了房子(自己申請乙個結構體),否則,沒人會白白送你房
子的(系統不會理會你這個指標指向**,更不會自己另外給你分配乙個結構體)。
如果還沒完全理解,那麼教個最簡單的方法,只要記住這個就好了:
鑰匙 = 32位 = 4位元組
這樣,你就不會搞混淆了。
【後記】
如果都只是弄把鑰匙,就都有了房子車子,那麼現在就不會有這麼多為買房買車而鬱悶的了,
直接去幾元錢複製一把就好了。。。
個人理解:
同樣,結構體是如此,在定義其他型別也是一樣
char *str1;
char str2[20];
這麼定義之後,我們只傳給str1一直指標,而不能給str1傳乙個字串。
在定義之後這樣使用:
sprintf(str1,"....",..);
那麼,這樣相當於往str1裡面裝東西,但是str1在記憶體中是乙個位址(可以看做乙個數),那麼str1在記憶體中只佔1個或2個位元組(實際根據os來定)。把乙個字串往str1裡面裝,就會出現segment fault段錯誤。
非要這樣做,那就需要用malloc給sr1申請空間。
但是這樣是合法的:
char *str1="asdfg";定義並初始化,系統會給str1分配乙個連續的空間放這個字串,字串的首位址放在str1中。
str1[20]在記憶體中那個,不管你是不是用,它都會有20個位元組。
指標與指標變數
1 i pointer是乙個指標變數,而 i pointer表示i pointer所指向的變數即i。下面兩個語句作用相同 i 3 i pointer 3 2 定義指標變數 基型別 指標變數名 下面都是合法的定義 float pointer 3 pointer 3是指向單精度型資料的指標變數 char...
定義指標變數 int a 與 int a
今天看 時,對定義指標變數有點亂,這可是大一學的啊,基礎不紮實,唉,丟人,寫了個程式,稍微記錄一下吧。include includeusing namespace std int main int a a new int 5 開闢存放5個元素的記憶體空間,指標變數a指向它的首位址 int c new...
C 定義乙個類,類的成員變數沒有指標
程式設計環境 win10,vs2017 include 01 namespace ds01 測試程式 void testdssize intmain 輸出address s1 008ff8f7 address s2 008ff8eb address s3 008ff8df 建立三個物件,三個物件的位...