關於定義乙個指標與指標變數

2021-05-21 19:16:23 字數 1783 閱讀 6262

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 建立三個物件,三個物件的位...