程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 扎實學習C語言(二)結構和聯合

扎實學習C語言(二)結構和聯合

編輯:關於C語言

關於結構體的一個問題:

看下面這個結構體的聲明,把它記作A

struct node
{


	int a;
	float b;
	struct node *next;
}s;


和如下的結構體聲明,把它記作B
struct node
{


	int a;
	float b;
	struct node  next;
}s;


他們的區別是啥?


今天學習《C和指針》第10章,以前,沒注意過這個問題,現在對聲明和定義的理解又深了一點

聲明是要告訴編譯器,這個甜餅機做出來的甜餅有多大,但是甜餅機不是甜餅本身,定義就是甜餅本身!

B中的結構體聲明不正確,是因為編譯器會認為 在 代碼語句 : struct node next 這裡是使用了未定義的標識符,因為此時struct node 這個結構體還沒有聲明成功,為什麼?因為聲明是要告訴編譯器你該給我這個變量預留多大的空間,而此時struct node 結構體的大小並不知道,甜餅機都沒有完成,當然吃不到甜餅啦!


A中的struct node * 是指針類型,我們知道指針類型在windows 32位機器上都是4字節,所以,編譯器分析到代碼句:: struct node *next時,你就可以知道我這個next變量是四個字節,從而完成聲明的工作


你會發現,next的類型換做任意結構體指針,都是可以正確編譯的,比如,struct unknown *next ; 此時雖然 struct unknown並沒有聲明,也是正確的,因為,編譯器此時並不關心具體的標號,我只關心我的工作,那就是分配內存!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved