⑴ 結構體成員的位元組對齊
這個問題都很有深度啊;
首先我要說的是,位元組對齊在不同編譯器下語法是不一樣的,在GCC中是#pragma push(1) #pragma pack(); 在MS C++中用VC的代碼項里可以調整,默認是8位元組;
typedef struct
{
char c;
int i;
}test;
位元組對齊,是對齊,比如說char 與 int 如果是4位元組對齊,那麼char也會佔用4個位元組,總共佔8位元組,而且結構體對象存儲是按照順序存的,char 肯定在int前面。第二種情況如果1位元組對齊,意味著char只佔1位元組,而結下來int會佔用4位元組,這個N位元組對齊的意思是,每個成員佔用空間必須是N位元組的倍數,不足N位元組的佔用N位元組。那麼以1位元組對齊那它佔用5個位元組。
還有你說的每種數據是低位還是高位在前,這個根處理器有關,Intel處理是小端對齊,比如說一個整數522387969用16進製表示是:0x1f 23 02 01,在Intel處理器中表示是0x01 02 23 1f,所以在內存用0x01 02 03 1f來示522387969,這就是所謂有小端對齊;但在arm處理器中522387969表示是0x1f 23 02 01,這就是所謂的大端對齊,這種方式又叫作網路位元組序。
當然前面說的位元組序只是對int long short這些內置(built in)數據類型用效,對結構體內如果有int long這類成員也會有所謂的位元組序,如前面所說,不管是什麼序結構體對象存儲是按照順序存,先定義的成員肯定在後定義的成員前面,但單個成員有位元組序,不知這樣說,你的明白?
不是,請仔細體會這句話:這個N位元組對齊的意思是,每個成員佔用空間必須是N位元組的倍數,不足N位元組的佔用N位元組。
大於N位元組就湊夠N位元組的倍數,比如按3位元組對齊,那麼一個4位元組的int將占據6位元組~
⑵ 為什麼結構體中的成員類型不能是該結構體本身,卻可以是以該結構體類型為基本型的
我的理解,結構體的在構造的時候肯定不能引用自身,不然就會形成嵌套死循環。
通俗一點的理解,定義一個結構體的時候,在定義其成員的時候,這個結構體還未完成。發現引用了一個還未定義完成的結構體(也就是他自身),編譯器會出錯把。
「以該結構體類型為基本型的」 後面是不是還有話啊,就這里看不懂 ,我是不是可以這樣理解,以該結構體類型為父的其他結構體。
那麼這個「其他結構體」必然是已經完成構造的,在最原始的父結構體中引用,編譯器不會出錯,但是我覺得用起來估計會有些毛病。
⑶ C語言結構體成員定義引用問題
沒有
A={
.age=10;
.class=3;
};
這種賦值方法,改成
A.age=10;
A.cass=3;
或
B->age=10;
B->class=3;
都行。
另:class是C++關鍵字,若使用的是C++兼容的C編譯器,則過不了編譯,應另起一名,如Class,或classs等。
⑷ c語言:結構體成員問題,如下:
char * name 是一個指針,變數name存放的一個指向字元串的首地址。
你memset之後。name變為零了。也就是說,是一個無效的指針。
對於不同的編譯器和執行環境來說,有的會報錯,有的則是什麼也不輸出。或者輸出其它的錯誤信息。
⑸ C語言結構體成員的引用問題
scanf的用法,格式後的參數都必須是地址,name是數組名,本身就是數據,age和sex都是整型數據,必須使用取地址符&。
p是struct student*類型,stu是stu[3]這個數組的第一個元素的地址,p指向第一個元素,因此ABC都是對的,D錯在把(int*)變數值賦值給(struct student*)變數,有個強制轉換則不會錯,因為age是結構體第一個變數,其地址就是結構體變數的地址。
是指針間的賦值,必須保證左右操作數的指針類型是一致的。由於n是結構體sk的第一個變數,因此其地址與結構體變數地址相同,可以強制轉換得到正確的地址。
c是一個二維數組,p是一個指向數組的指針,因此p的*運算都是得到一個數組,**運算才能取到數組中的值。只有D是**運算。
(5)編譯器結構體成員擴展閱讀:
C語言初學者比較喜歡的Turbo C2.0提供了400多個運行時函數,每個函數都完成特定的功能,用戶可隨意調用。這些函數總體分成輸入輸出函數、數學函數、字元串和內存函數、與BIOS和DOS有關的函數、 字元屏幕和圖形功能函數、過程式控制制函數、目錄函數等。
Windows系統所提供的Windows SDK中包含了數千個跟Windows應用程序開發相關的函數。其他操作系統,如Linux,也同樣提供了大量的函數讓應用程序開發人員調用。
參考資料來源:網路-C語言
⑹ 結構體變數與結構體成員能同名嗎
結構體,在C++中,是一個類而已。所以,不管是類,還是結構體,它產生的對象名,其實是可以與成員同名的。
所以A是錯的。而B和C,因為編譯器根本不會為結構體分配內存,而只是為結構體變數分配內存。
例如:
struct Student
{
int num;
int age;
char sex;
}
void main()
{
cout<<sizeof(Student)<<endl;//可以測得Student的大小
//cout<<&Student<<endl; //這句非法,因為不能對結構體進行取地址運算
Student s; //聲明一個結構體變數s
cout<<&s<<endl;//對s取地址
}
而D選項,st根本不是外部的結構體。
所以這道題應該沒有正確答案。
做題,其實沒有實際意義,只有實際去編程才有意義。
⑺ 怎樣添加和刪除結構體中的成員怎樣搜索已經存在的成員
添加和刪除只能修改這個
結構體
的定義了。
至於查看已經存在的成員,如果你使用的
編譯器
自動提示,比如在本結構體的一個變數後加'.',就能顯示已經存在的成員了。要是不行,你只能查看定義了。