1、結構體作爲一種數據結構,可以靈活的用來表示多種數據的集合,不僅僅在C語言中應用廣泛,在C++中也 是頗爲常見。
2、結構體在C語言中和C++中有着一定的區別,主要是結構體的定義形式上會有一定的差別,這一點會在後面 的例子中提及
3、在C++中結構體也是作爲面向對象來使用的,struct 和class 的區別在於struct 默認其數據成員和成員函數爲公有,而class默認其數據成員爲私有的。所以能夠使用class的 地方都可以使用struct進行代替使用,具體使用哪一種,那就看你的喜好了。
4、結構體在C語言中的聲明和定義:
1)、結構體的形式:
struct book{
char author[20];
char ISBN[20];
double sale;
}
2)、結構體的聲明和定義:
結構體的聲明和定義有三種形式:第一種便是上面所提到的,
struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
struct book ChineseBook,EnglishBook;
我們也可以聲明和定義無名結構體:
struct{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
無名結構體在聲明的時候不添加名字,直接在末尾添加上結構體變量,這種用法有一定的侷限性,靈活添加變量。也就是說,一旦聲明結束,我們想重新定義一個該結構體類型的變量時,就行不通了。不能像第一個那樣,在程序中使用 struct book ChineseBook,EnglishBook;
來定義新的變量。
使用typedef 來聲明和定義結構體:
<pre name="code" class="cpp">typedef struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
book ChineseBook,EnglishBook;
注意看使用typedef和第一方式的區別,使用typedef定義的結構體,在定義新的變量時不需要再加上關鍵字struct。
5、結構體在C++中的定義和聲明
1)、在C語言中的定義方式在C++之中均行的通。
2)、在C++中定義結構體時,上面說到的第一種和第三種方式沒有區別,這是編譯器對語言進行的優化,這一點我們得感謝偉大的編譯 器。也就是說在C++中,第一種方式可以按照下面的形式來定義變量:
struct book{
char author[20];
char ISBN[20];
double sale;
}ChineseBook, EnglishBook;
book ChineseBook,EnglishBook;
3)、在C++中可以在struct內部加上關鍵字 public,private,protected,這一點後續會講到。
6、結構體的應用
結構體主要有兩方面的應用:結構體做函數參數,使用結構體來創建新的數據結構。這篇文章先講一講使用結構體做函數參數。先看一下例子:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct _Teacher{
char szName[20];
int age;
char *p;
}Teacher;
int ChangeStruct(Teacher t1, Teacher t2)
{
memcpy(&t2, &t1, sizeof(Teacher));
return 0;
}
int ChangeStruct1(Teacher *t1, Teacher *t2)
{
memcpy(t2, t1, sizeof(Teacher));
return 0;
}
void main()
{
Teacher t1;
Teacher t2;
t1.age = 20;
memset(t1.szName, 0, sizeof(t1.szName));
strcpy_s(t1.szName, sizeof(t1.szName), "Beautiful Lady");
t1.p = NULL;
t2.age = 10;
memset(t2.szName, 0, sizeof(t2.szName));
t2.p = NULL;
ChangeStruct(t2, t1);
printf("%d\n", t2.age);
printf("%s\n", t2.szName);
ChangeStruct1(&t1, &t2);
printf("%d\n", t2.age);
printf("%s\n", t2.szName);
system("pause");
}
程序運行的結果如下:
解釋一下這個程序的意圖:想要將第一個結構體的內容拷貝給第二個結構體,int ChangeStruct(Teacher t1, Teacher t2)是按值傳遞,
int ChangeStruct1(Teacher *t1, Teacher *t2)傳遞的則是一個結構體的指針。然後運行程序後發現,第一個函數並沒有達到我們想要的目的,第二個函數達到了。這其 實和要交換兩個數的值swap(int *,int *)的原理一樣,這一點大家自己去琢磨。
還有一點需要注意的是:兩個結構體之間可以直接賦值,也就是 我們可以使用 t2 = t1;來操作。但是我爲什麼沒有這樣做呢,後面一節會給大家帶來詳細的解答,同時也希望大家不要這樣做。