C語言的幾種結構體Struct的賦值方法

C語言的幾種結構體Struct的賦值方法


1. 定義結構體類型

這裏是兩個結構體的基本結構。

struct Init{
	int a;
	float b;
	double c;
}I1;
struct SIMPLE{
	int a;
	float b;
	double c;
};
stuct SIMPLE s1;

然而即使兩個結構體成員列表全部一樣,但是這兩者還是被編譯器當做完全不同的存在。一個類型是struct Init 一個類型是 struct SIMPLE就相當於int 和float 一樣。
結構體中可以包含其他結構體。

  1. 結構體中包含其他結構體類型變量。
struct COMPLEX{
	char string[100];
	struct SIMPLE id1;
};
  1. 結構體中也可以包含指向自己的結構體指針。
struct NODE{
	int nodenum;
	struct NODE *NextNode;
}

NextNode就是指向相同結構體類型中的下一個結構體的首地址,在未定義的情況下NextNode的值一般都是置NULL。這樣就有可能無限延伸是不是很神奇。
下面的內容中,需要大家稍微瞭解下,初始化與普通賦值的區別。
變量的初始化:是指在定義變量的同時就爲該變量賦值。
結構體變量在
初始化*時應該用**花括號“{}”**將用來初始化的各個數值括起來,並且各個數值之間要用逗號分隔開來,同時必須保證數值與相應成員變量的類型要一一對應。
對於變量而言,如果已經定義了類型,那麼在系統內部已經爲該變量開闢了內存空間。
成員變量在結構體變量定義好後,已經置爲各自類型的NULL狀態,如int a;a默認值爲0。
這裏有種特殊情況。

直接定義結構體變量。也就是聲明一個無名的結構體類型。

無名結構體變量由於省略了結構體類型名,無法記錄該結構體類型,所以該方式只能用來聲明結構體變量,而且以後也不能用他來聲明變量或函數等等。

#include <stdio.h>
struct{
	int a;
	double b;
	char *c;
}idx;

也就是下面的內容中,定義結構體變量之後,初始化定義是無法用的,只可以用成員運算符。

1.1 定義結構體類型時,同時定義結構體變量

在這種情況下賦值成員變量可以是同時進行,也可以是先後進行,就和int a = 1;和int a;a = 1;是一樣的道理。但是意義上有些不同
定義結構體變量的同時,初始化結構體變量,相當於int a = 1;
定義結構體變量之後,初始化結構體變量,這在普通變量中是不可以的,因爲這就相當於 int a;int a = 1;這樣子對普通變量而言就是錯誤。
定義結構體變量之後,對結構體變量進行非初始化的賦值,相當於 int a;a = 1;

1.1.1 定義結構體變量的同時,初始化結構體變量

#include <stdio.h>
struct Init{
	int a;
	double b;
	char *c;
	float d;
}id1 = {1,2.0,"hello"},id2[2],*id;

賦值之後只是修改了這個成員變量的值,如果賦值只是修改該變量的值,對於地址等內容沒有任何影響。

1.1.2 定義結構體變量後,賦值成員變量

#include <stdio.h>
struct Init{
	int a;
	double b;
	char *c;
	float d;
}id2;

這種就是還未經過初始化的結構體成員變量定義。而想要在未經初始化的結構體變量定義之後,對該結構體進行成員變量修改。
形式上有所不同,可以分爲以下兩種方式。

第一種是有序賦值(初始化定義)。
struct Init id2 = {1,1.1,"hello"};

這樣默認float爲空。
【注1】這種樣式是結構體變量的定義。相當於前面雖然已經定義了結構體變量,但是那某種程度上也是聲明,而這裏對結構體變量的值以定義的形式進行了初始化。
而這也就意味這樣的賦值只能進行一次,如果再次進行就意味着重複定義,如下所示。
在這裏插入圖片描述
【注2】而且不能將結構體作爲一個整體進行輸入輸出,也就是結構體變量一旦定義完成之後,不能當做被一個單獨的變量,進行賦值如下圖所示。
在這裏插入圖片描述
但是可以用下面的成員運算符進行賦值。

第二種是無序賦值,也就是鍵值對類型。

這種方式利用成員運算符,進行賦值。而這種也是分爲結構體內部賦值和結構體外部賦值
這種賦值方式涉及結構體成員的引用。
引用方式爲:結構體變量名.成員名。起鬨“.”是成員運算符,也稱爲分量運算符,它在所有運算符中優先級最高。

下面這種是對成員變量賦值。即使是在未經過結構體變量初始化的情況下,也是可以賦值的。

struct Init id2;
id2.a = 1;
id2.c = "world";
id2.d = 1.1;

下面這種則是初始化,也是定義,即利用成員運算符進行初始化,在結構體變量內部,在成員運算符前面加或者不加結構體變量名都是可以的。

struct Init id2 = {
	id2.a = -1,
	.c = "hello",
	.b = 4.0
};

在這裏插入圖片描述

2. 補充

  • 如果成員本身又屬於一個結構體變量類型,則要用若干個成員運算符,一級一級地找到最低一級的成員,並且只能對最低級的成員進行操作。
  • 可以將一個結構體變量直接賦值給另一個具有相同結構的結構體變量。
  • 對成員變量可以像普通變量一樣進行各種運算。
  • 可以引用成員的地址,也可以引用結構體變量的地址。結構體變量的地址主要用作函數參數,傳遞結構體的地址。
發佈了27 篇原創文章 · 獲贊 6 · 訪問量 4247
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章