C語言正確定義結構和初值,C語言中是如何定義常量的啊?

2022-10-08 17:15:04 字數 5709 閱讀 1084

1樓:風若遠去何人留

39 std就是結構體型別的別名。由於typedef的時候,只有struct,所以這是乙個無名結構。只有通過std去定義。於是c和d都是錯的

而結構體中,c的型別是char,所以也只能用字元型去初始化。b中的"a"和"b"是字串,所以不對。

選a40 union中,n和c共用記憶體。

所以 在這裡賦值u1.c為'a'時,等於將n的地位也賦值為'a'了而以%c輸出u1.n時,取的也是u1.n的低位元組,也就是'a'

所以會輸出a選c

2樓:在晴天的雨傘

宣告的時候和後續賦值略有不同,在c語言中是兩種處理方法。

如有結構體

struct test

;定義的時候,可以

struct test var = ;

這樣初始化,結果為var.a = 1, var.c = 'c', var.b = 2;

但是如果後續賦值

var = ;

就會報錯。因為在c語言中不支援這種形式的操作。

不過可以取巧轉換一下,改成

var = (struct test);

這樣就可以了。 在這種情況下,系統會申請乙個臨時變數,並初始化為該值,再對var進行賦值。而同型別結構體之間賦值操作是c語言規則允許的。

c語言中是如何定義常量的啊?

3樓:千鋒教育

在c#中定義常量的方式有兩種,一種叫做靜態常量(compile-time constant),另一種叫做動態常量(runtime constant)。前者用「const」來定義,後者用「readonly」來定義。

對於靜態常量(compile-time constant),它的書寫方式如下:

public const int max_value = 10;

為什麼稱它為靜態常量呢,因為如上宣告可以按照如下理解(注意:如下書寫是錯誤的,會出編譯錯誤,這裡只是為了方便說明)。

public static const int max_value = 10;

用const定義的常量,對於所有類物件而言都是一樣的,因此需要像訪問靜態成員那樣去訪問const定義的常量,而用物件的成員方式去訪問會出編譯錯誤。此外,對於靜態常量的訪問在編譯的時候,是用常量的值去替換常量,例如:

int nvalue = max_value;

這句在編譯之後,和如下這句所產生的中間語言**是一樣的。

int nvalue = 10;

不過,在用const來定義常量的時候,在型別上有很多限制。首先,此型別必須屬於值型別或者string型別,同時此型別的初始化不能通過new來完成,因此一些用struct定義的值型別常量也不能用const來定義。

相對於const而言,用readonly來定義常量要靈活的多,它的書寫方式如下:

public readonly int max_value = 10;

為什麼稱為動態變數,因為系統要為readonly所定義的常量分配空間,即和類的其他成員一樣擁有獨立的空間。此外,readonly所定義的常量除了在定義的時候可以設定常量值外,還可以在類的建構函式中進行設定。由於readonly所定義的常量相當於類的成員,因此使用const來定義常量所受到的型別限制,在使用readonly去定義的時候全部消失,即可以用readonly去定義任何型別的常量。

4樓:迠寋漧

c語言定義常量常用的方法有以下2種:

第一種:巨集定義

#define n 3 // 定義了乙個常量為3的巨集n,在程式中n就代表3

第二種:給變數初始化賦值

int a = 2; // 定義了乙個int型變數,並賦值為2,其實這是用變數來定義常量

注:定義常量還是用巨集定義的比較多。

c語言結構體定義 25

5樓:chanrich輕輕

所謂結構體陣列,是指數組中的每個元素都是乙個結構體。在實際應用中,c語言結構體陣列常被用來表示乙個擁有相同資料結構的群體,比如乙個班的學生、乙個車間的職工等。

結構體可以儲存不同的資料型別,將他們互相聯絡起來。結構體陣列可以連續儲存多個結構體,和陣列作用相似。比如想定義同乙個最小外接矩形的四個座標值,並給予這個矩形乙個特徵編號。

當需要儲存多個最小外接矩形的資訊時,就需要動態申請乙個結構體陣列。

struct 結構體型別名{型別名 成員名;型別名 成員名;……},先宣告結構體型別,再定義結構體變數名。宣告結構體型別,不分配空間,定義結構體型別變數,就要分配記憶體空間。

擴充套件資料:

結構體陣列指標型別:

乙個結構體變數的指標就是該變數所佔據的記憶體段的起始位址。可以設乙個指標變數,用來指向乙個結構體變數,此時該指標變數的值是結構體變數的起始位址,指標變數也可以用來指向結構體陣列中的元素。

1、型別一:

指向結構體變數的指標引用結構體變數中的成員。

2、型別二:

用結構體變數和指向結構體變數的指標構成鍊錶,鍊錶是一種常見的重要的資料結構。鍊錶有乙個「頭指標」變數,以head表示,它存放乙個位址。該位址指向乙個元素。

鍊錶中的每乙個元素稱為「結點」,每個結點都應包括兩個部分:

一是使用者需要用的實際資料,

6樓:藥郎小跟班

結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標誌,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體宣告的變數。在一般情況下,tag、member-list、variable-list這3部分至少要出現2個。

結構體的成員可以包含其他結構體,也可以包含指向自己結構體型別的指標,而通常這種指標的應用是為了實現一些更高階的資料結構如鍊表和樹等。如果兩個結構體互相包含,則需要對其中乙個結構體進行不完整宣告。

擴充套件資料:

一、結構體作用:

結構體和其他型別基礎資料型別一樣,例如int型別,char型別,只不過結構體可以做成你想要的資料型別,以方便日後的使用。

在實際專案中,結構體是大量存在的,研發人員常使用結構體來封裝一些屬性來組成新的型別。由於c語言內部程式比較簡單,研發人員通常使用結構體創造新的「屬性」,其目的是簡化運算。

結構體在函式中的作用不是簡便,其最主要的作用就是封裝。封裝的好處就是可以再次利用。讓使用者不必關心這個是什麼,只要根據定義使用就可以了。

二、結構體的大小與記憶體對齊:

結構體的大小不是結構體元素單純相加就行的,因為我們主流的計算機使用的都是32bit字長的cpu,對這型別的cpu取4個位元組的數要比取乙個位元組要高效,也更方便。

所以在結構體中每個成員的首位址都是4的整數倍的話,取資料元素時就會相對更高效,這就是記憶體對齊的由來。每個特定平台上的編譯器都有自己的預設「對齊係數」(也叫對齊模數)。

程式設計師可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數,其中的n就是你要指定的「對齊係數」。

三、結構體的規則:

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

3、結合1、2可推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

7樓:杜哥是個小天才

struct namename;

拓展資料c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平台的特性,以乙個標準規格寫出的c語言程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱mcu)以及超級電腦等作業平台。

二十世紀八十年代,為了避免各開發廠商用的c語言語法產生差異,由美國國家標準局為c語言制定了一套完整的美國國家標準語法,稱為ansi c,作為c語言最初的標準。目前2023年12月8日,國際標準化組織(iso)和國際電工委員會(iec)發布的c11標準是c語言的第三個官方標準,也是c語言的最新標準,該標準更好的支援了漢字函式名和漢字識別符號,一定程度上實現了漢字程式設計。

8樓:知識慧

c語言結構體型別的定義模板大概為:

struct 型別名 變數;

在c語言中,結構體(struct)指的是一種資料結構,是c語言中聚合資料型別(aggregate data

type)的一類。結構體可以被宣告為變數、指標或陣列等,用以實現較複雜的資料結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的型別,成員一般用名字訪問。

在成員表列中可以是幾種基本資料型別,也可以是結構體型別。

struct 型別名{} 變數;後的分號不能漏

下面給出定義結構體型別的幾種方法:

1. 先定義結構體型別,再定義結構體變數。

struct student;

struct student stu1,stu2;//此時stu1,stu2為student結構體變數

2. 定義結構體型別的同時定義結構體變數。

struct student stu1,stu2;

此時還可以繼續定義student結構體變數如:

struct student stu3;

一般不會使用第三種定義方法,因為直接定義結構體變數stu1,stu2後就不能再繼續定義該型別的變數。

c語言裡變數的"初始化"和"賦初值"一樣嗎?

9樓:育知同創教育

語法上的初始化是指物件定義時,對應的分配空間之後對於值的操作。c語言中,靜態和全域性變數預設置0,有初始化列表的複製初始化列表的值到空間(如有不足,剩餘部分置0),區域性自動變數可以不初始化(偵錯程式參與時可能被隱式地初始化為其它的值("debug magic number"),例如預設情況下microsoft c/c++ debugger會把棧中未初始化的位元組置為0xcc)。

賦初值一般而言是指邏輯意義上的初始化。在c語言中,由於初始化的語法是「=」後加初值,所以「賦初值」基本上就是指語法上的初始化。不過隨著語言的發展,「賦初值」的意義發生了擴大。

對有構造語義但又允許不初始化而不產生編譯錯誤的程式語言而言,兩者有些微妙的差別。例如c++的建構函式中,用若干個成員名和括號括起來的初始化值構成的初始化列表是語法上的初始化(也可能是邏輯意義上的初始化,如果沒有被建構函式體內的值覆蓋),而建構函式體中對成員的賦值語句是邏輯上的初始化但不是語法上的初始化。

冰的悸動 錯誤:

1.「程式開始時進行初始化」的說法僅僅適用於靜態或全域性變數,而不適於區域性自動變數。區域性自動變數在函式呼叫時才能被初始化。

2.「但是根據編譯器的不同有些編譯器會自動賦初值0或其他」——這在iso/iec c語言標準中不是由實現定義的行為,如果乙個編譯器符合標準,那麼行為就是明確的,即視此初始化的物件是否為全域性物件來判斷隱式初始化置0還是不進行初始化——從下面的函式定義來看這裡應該var2是全域性變數,會被置0。非標準編譯器則另當別論(但是我還沒見過會在這點上沒事找茬的)。

c語言定義結構體變數,C語言 定義結構體變數

樂跑小子 首先,定義一個結構的一般形式為 struct結構名 成員表由若干個成員組成,每個成員都是該結構的一個組成部分。對每個成員也必須作型別說明,其形式為 型別說明符 成員名 成員名的命名應符合識別符號的書寫規定。例如 struct stu 在這個結構定義中,結構名為stu,該結構由4個成員組成。...

c語言結構體定義了,C語言結構體 定義了typedef struct int key element 能否在main函式裡定義element x

bai。太強大了。翻譯過du來是這樣zhi的。定義 型別dao 型別名。簡單說。int是整型內。容那element 就相當於int a中的a,struct相當於int。理解麼?不理解。換個,陣列名。就是element,陣列就是 struct key就是陣列裡面的 i。這樣該懂了吧。沒有名稱的結構體就...

c語言關於陣列賦初值的問題,C語言關於陣列賦初值的問題char buff

char buff 5 這樣寫賦初值,雖說沒有給buff 1 buff 4 賦值,但是預設是賦值0的,這樣寫沒問題。很多教材上都有的。char buff 10 是可以把這個陣列的所有元素的賦值成0的。不信你用下面的 測試一下。include void main int i for i 0 i 4 i...