閱讀263 返回首頁    go 阿裏雲 go 技術社區[雲棲]


關於定義一個指針與指針變量


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個字節。

 

最後更新:2017-04-02 04:01:46

  上一篇:go 使用Qt做一個簡易音樂播放器[Phonon淺談--續]
  下一篇:go 《LINUX設備驅動程序》學習劄記(二)