結構體及其應用:認識結構體

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;來操作。但是我爲什麼沒有這樣做呢,後面一節會給大家帶來詳細的解答,同時也希望大家不要這樣做。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章