1、結構體的宣告:struct
結構體名[可省
]變數列表[可省
](多個變數用逗號隔開);
例1:struct employee
char strempid[10];
}emp; //emp為結構體變數
例2:struct employee
char strempid[10];
}; //預設
struct employee emp;//定義屬於employee 的結構體變數
例3:struct emp; //該法只能在建立結構體時定義該結構體的變數,此法適用性較差
2、目前一般用下述定義方法:
typedef struct employee[可省]
成員列表
}emp,*pemp; //emp為型別,
pemp
為指標;均是結構體名,而非變數。
emp e2; //e2為結構體變數
pemp e3=null; //等價於
employee* e3=null;
e3=&e2;
strcpy(e3->strempid,」1000」); //對第
0個位置賦值
strcpy((e3+1)->strempid,」1002」); //」1002」表示長度為5
,(e3+1)
即e3[1] ,對第1個位置賦值
typedef employee emp;
typedef employee* pemp;
e3=( employee*) malloc(10*sizeof(employee));
free(e3); //malloc 必須與
free
對應,否則會造成資源洩漏
e3=new employee[10]; //10個空間
delete e3;
3、結構體變數引用
同類結構體變數可以互相直接賦值,如emp e1,e2; e1 = e2;
非指標變數用"."
來使用結構體成員變數,如
e1.strempid;在指向結構體變數的指標變數中使用 "->"
。即有:結構體名
.成員名
<=> p->成員名
<=>(*p).成員名。
4、結構體初始化:
可選擇針對某個結構體變數的成員逐個進行初始化,或者對整個結構體變數初始化。但整體初始化只能在定義結構體變數的時候進行。例:
struct aatest1=,test2=;
struct aa test3=;
對於單個成員賦值只需用:" 結構體變數名.
成員名
= ;"
5、結構體變數可為陣列,如:
struct aaaaa[3];
mem* 記憶體操作函式
(1) 記憶體之間拷貝字元
void * memcpy(void *dest,const void *src,size_t count);
(2) 給記憶體塊設定特定的字元值
void *memset(void *dest,int c, size_t count); // dest表示記憶體塊位址
eg: memset(&e1,0,sizeof(employee)); //清0
(3)拷貝字元,遇到
c停止且返回
dest
或拷貝個數為
count停止
void *_memcpy(void *dest,const void *src,int c,unsigned int count);
eg: void main()
{int n;
int nsrc=100;
memcpy(&n,&nsrc,sizeof(int));
employee e1;
strcpy(e1.strempid,」1000」);
employee e2;
memcpy(&e2,&e1,sizeof(employee)); //e2=e1 當
employee
中含指標時就不可以了;此外當e1
為指標時不用&
結構體大小及記憶體對齊
結構體大小 在計算結構體大小時,有幾點需要注意 1.char可存放在任意位址,short存放在能被2整除的位址,int存放在能被4整除的位址 即資料型別存放的位址要能被其資料型別所佔位元組數整除。可先將每個成員的位元組數寫出,然後從第二個成員開始,將前面成員的總位元組數補齊成當前位元組數的倍數。2....
詳解C語言中的記憶體四區模型及結構體對記憶體的使用
記憶體四區 1 區 區code,程式被作業系統載入到記憶體的時候,所有的可執行 都載入到 區,也叫 段,這塊記憶體是不可以在執行期間修改的。2 靜態區 所有的全域性變數以及程式中的靜態變數都儲存到靜態區。3 棧區 棧stack是一種先進後出的記憶體結構,所有的自動變數,函式的形參都是由編譯器自動放出...
C語言 記憶體中結構體位元組對齊
一 位元組對齊作用和原因 對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。比如有些架構的cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊,其他平台可能沒有這種情況,但是最常見的是如果不...