問題的**於在學資料結構的時候,c++的語法和c語言的語法竟然不一樣。
1.首先函式的引數有兩種傳遞方式,乙個是值傳遞,乙個是位址傳遞。當指標作為引數傳遞的時候,即為位址傳遞,但c++寫的時候需要加&引用符號,而c語言卻不用。
看到一篇文章是這麼寫的
問題描述:
主題:定義結構體指標時,有沒有同時分配儲存空間
定義結構體指標時,有沒有同時分配儲存空間啊?
看到結構體的陣列定義好以後就直接可以用了。
但是結構體指標在鍊錶中還要malloc()申請空間。
這是為什麼啊?
1樓:
定義結構體指標時並沒有分配儲存空間,所以要用malloc()申請空間。
2樓:
很明顯,你還沒有搞清楚什麼是指標,至於結構體變數和結構體指標,更是很混淆,所以這裡不是因為陣列的問題。
舉個例子:
//下面僅僅是定義乙個型別,不會產生變數,所以不存在分配空間的問題
struct data
;void main(void)
3樓
宣告任何物件並定義變數,包括指標都會開闢空間,除了靜態成員在乙個特別的區,其他的在棧上開闢空間,不用了自動清理,用malloc, realloc, calloc, new new開闢空間是動態分配空間,在堆上進行。值得說明的是,棧空間很小(相對於堆而言),很"昂貴",但是通常執行更快。
在windows下,乙個程序的棧在最高端,向下增長,堆在棧下面,向棧的方向增長,下面是資料和**。linux下記憶體布局由開發工具和作業系統合作負責,這四個部分相對位置布局不確定。
-------------------- |
|棧 v v
v-------------------- ^
^堆 | |
|-------------------- 其他
4樓
windows預設棧大小是1m
棧和堆是共享一記憶體的,可以調節它們的比例。來設定棧和堆的大小。
不過一般情況下,還是用不著的。。
5樓
[quote]
有人告訴我:
a a[3]; a是a型的,有3個,當然分配a乘3大小的空間
a* a; a是a*型的,當然只分配a*大小的空間,而不會分配a大小的空間
好像跟你說的不太一樣,結構體陣列的話,我在課本裡看到的確不用再次申請空間了啊[/quote]
結構體變數分配結構體本身大小的空間,結構體指標分配4個位元組,其實任何型別的指標都是分配四個位元組的指標空間。
所以:a a[3]; //a裡面是三個a變數,所以分配三個結構體大小
a *a; //a是乙個指標,分配4個位元組,就算a再大,a也只是4個位元組,因為任何型別的指標都是4個位元組。要使用a,必須先要對指標初始化,也即分配空間了。 如:
a *a;
a = (a*)malloc(sizeof(a));
我們完全可以撇開結構體,把問題簡單化成int型別來說明這個指標問題:
int a1[10];
int *a2;
很容易知道,a1是包含10個int的陣列,大小也就是10*sizeof(int)。我們可以直接使用a1不要在進行什麼初始化或者分配空間的遊戲,因為陣列a1裡面本身存放的就是int變數本身了。
然後a2,是乙個int*的東西,也就是整型指標,a2不能存放int變數,它只能存放位址,乙個int變數的位址。如果要使用a2,必須首先對a2初始化,即將它指向乙個int變數的位址,如:
a2 = (int*)malloc(sizeof(int)); 或者
int i = 10;
a2 = &i;
所以,malloc函式的作用是首先宣告乙個變數,然後返回該變數的位址。
所以:a2 = (int*)malloc(sizeof(int)) 的含義就是把該變數的位址賦值給a2,和a = &i 本質上並沒有什麼不同,只是乙個變數是棧上,乙個是堆上,都是乙個位址賦值。
所以,所謂的分配空間,就是對指標賦值,把乙個變數的位址賦值給乙個指標。
----------我是萌萌噠分割線----------
很明顯三樓和四樓講的有點底層了,不過其他樓層說的很明白,首先只是分配了指標本身的儲存空間,指標指標還沒有被賦值,通過new或者malloc()語句是為了給結構體變數分配記憶體空間,即為指標賦值,即指標指向的內容的資訊,便有了指標指向的資料內容和空間。
----------我是萌萌噠分割線----------
C C 語言結構體中定義另乙個結構體指標的經驗
本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...
C C 語言結構體中定義另乙個結構體指標的經驗
本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也可以繼續新增人的相關資訊進去,比如學號,班...
C C 語言結構體中定義另乙個結構體指標的經驗
本文進行討論的是,在linux中,c c 語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,比如 cpp view plain copy struct person 這個結構一攜帶的就是乙個人的兩個基本資訊,年齡 age 和身高 height 同樣你也...