關於C語言結構體定義的問題,C語言裡結構體的問題。結構體定義指標型別是怎麼回事?

時間 2022-04-04 16:33:50

1樓:幹建設暨煙

*parr_t就是乙個指標。

其中parr_t中儲存著對應的位址

*parr_t就是這個位址對應的變數,而且這個變數是arphdr結構型別

2樓:苦秋英御娟

我見過這樣的題,沒看懂你的意思,不過我看這樣說吧,structab;

我打。。。的地方表示你可以在那裡新增所有的資料形式的定義,比如,int

a;char

a[10];等等;

而b表示變數名。就如同int

a的a一樣,只是乙個變數標示符,他就是乙個結構體變數了。當你使用typedef使,它表示的是列舉型別,功能如同巨集定義一樣,

使用他的時候方法如下:

首先寫出你要表示的變數型別。列如:int

a;然後在int的前面加上typedef,typedef

inta;然後把變數名a

改變成你要使用的表示符如

pp;現在就變成

typedef

intpp;

當你要在定義其他的變數是int型的時候,你就可以這樣定義了ppb;

這裡的b就是變數名了。注意列舉型別它並不產生新的變數型別,只是一種替代作用。我在給你舉個列子吧

typedef

struct

anum;

numn;

這時候n就是

struct

a型別的結構體變數了。不知道你懂沒有。。。

c語言裡結構體的問題。結構體定義指標型別是怎麼回事?

3樓:小笑笑狗狗

您好,您的問題是不是有點略多,下面一一為您解答:

1、typedef char **huffmancode 實際上是typedef (char *) *huffmancode。寫成這種形式更好理解, **huffmancode是指向指標的指標,這裡也可以理解為是指向字串的指標,因為char*字元陣列相當於字串。

2、*huffmantree表示指向結構體htnode的指標,htnode是typedef語法指定的結構體的別名,然後*huffmantree是在定義結構體的同時定義了指向結構體的指標。

3、指標只是乙個位址,huffmantree作為結構體指標同樣是乙個位址,因此不存在它內部有4個變數一說。嚴格意義上講是huffmantree這個指標指向的結構體中有這4個變數,而這4個變數和在main函式裡定義的普通變數一樣,都占用實際記憶體,在新建結構體的同時為這4個變數分配記憶體空間。

4、ht=(huffmantree)malloc((m+1)*sizeof(htnode))。這個是malloc的語法,該語句的含義是分配m+1個htnode結構體占用的記憶體,將分配的記憶體位址賦給ht。sizeof作用是判斷某個型別所占用的記憶體空間,此處是計算htnode占用的空間大小,然後(m+1)*sizeof(htnode)表示m+1個htnode,malloc是請求分配記憶體,(huffmantree)是強制型別轉化,將得到的記憶體位址強制轉化為huffmantree(即htnode指標型別)。

5、malloc是c語言中常用的動態分配記憶體的語法,劃重點「動態」,當你需要動態申請記憶體時(例如給陣列擴容,還有此處的為結構體申請空間)時用到該語法,c語言中記憶體相關語法還有realloc,free可以自行了解一下。在c++中new和delete更為常用。

4樓:銀霜傲雪

char **是指向指標的指標

huffmantree既不是變數也不是位址,是定義的乙個別名,注意看struct前面還有乙個typedef ,所以huffmantree是這個struct的指標的別名,所以huffmantree ht就可以看作是htnode *ht。

malloc是動態分配記憶體空間,在你事先不知道要分配多大空間的時候使用

5樓:公尺嵐

比如struct lnode*linklist;

lnode是結構變數名;

linklist就是指標,指向該結構體的指標。

呼叫內部應為:結構變數名.成員名

6樓:匿名使用者

malloc()分配乙個記憶體單元 然後把這個單元的首位址賦給乙個指標。huffmantree ht;只是定義乙個htnode的指標並沒有給ht分配記憶體,所以必須用malloc給它分配一塊記憶體!

c語言結構體定義問題

7樓:匿名使用者

typedef struct student *stu;  //定義struct student *為stu。以後可以使用stu表示結構體指標型別。

y = (stu)malloc(sizeof(stu)); //

首先,這裡的y應該是結構體指標,定義如struct student *y; 或者直接stu y;(因為上面的定義)

其次,這個定義不對,應該是y = (stu)malloc(sizeof(struct student)); 定義結構體指標指向乙個結構體大小的空間。而不是指向結構體指標大小的空間。

完整的**是:

#include

#include

typedef struct student *stu;

struct student;

// 或者定義為:

/*typedef struct studentstudent;  定義struct student 為student,因為不這麼定義,當使用結構體時需要struct student在一起使用。*/

int main(void)

8樓:匿名使用者

typedef struct student *stu的含義,定義stu為指向結構體student的指標;

所以y = (stu)malloc(sizeof(stu));是指向乙個通過動態記憶體分配而獲得student結構體變數的指標。

y->score 取出變數的score成員

9樓:匿名使用者

c語言中結構體名字要和struct合用才有效。

即 struct student,可以看做是乙個整體,表示一種結構體型別。

typedef struct student *stu;

意思就是stu 等同於struct student*即stu y;

=>struct student *y等價y是指標,理由你自己也說了。

c語言結構體成員定義引用問題

10樓:

沒有a=;

這種賦值方法,改成

a.age=10;

a.cass=3;

或b->age=10;

b->class=3;

都行。另:class是c++關鍵字,若使用的是c++相容的c編譯器,則過不了編譯,應另起一名,如class,或classs等。

c語言結構體定義 25

11樓:chanrich輕輕

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

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

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

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

擴充套件資料:

結構體陣列指標型別:

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

1、型別一:

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

2、型別二:

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

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

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

12樓:藥郎小跟班

結構體的定義如下所示,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值的大小將不產生任何效果。

C語言,結構體和函式的問題,關於C語言結構體和函式的問題

include struct math void main struct math add struct math s1,struct math s2 回答的人還挺多,居然沒樓上的手快,看來我只有增加內容了!說明 區域性函式需要乙個返回值,給z。這道題可以有三種解決方法 一 用指標,讓區域性函式返回...

c語言結構體問題,C語言結構體成員的引用問題

c 允許使用者根據需要自己宣告一些型別,使用者可以自己宣告的型別還有結構體型別 structure 共用體型別 union 列舉型別 enumeration 類型別 class 等,這些統稱為使用者自定義型別 user defined type,udt struct student type,你已經...

關於c語言結構體變數成員引用的問題

結構體成員運算子。指標運算子。1 如果結構體中的成員均為一般變數 包括結構體變數 則使用 如果成員變數為指標 不管指向什麼,包括結構體 則使用 2 如果定義了結構體陣列指標,則可分別使用 和 區別在於指標帶下標時,以是陣列形式訪問,此時用 如果不帶下標 或使用偏移 此時用 如 struct mytm...

關於c語言結構巢狀發什麼的問題,關於c語言 結構巢狀發什麼的問題

同學,就我看來,你的程式有如下幾個問題 1.結構體賦值是淺拷貝,意思就是直接結構體的記憶體的拷貝。如果遇上指標和陣列,只是複製了指標或陣列的位址,那麼問題來了,如果指標指向的記憶體被釋放,那麼此時指標成為野指標,就會出現一些不可預見的問題。如圖,就你程式來說 student 結構體內有陣列,max變...

c語言結構體可以定義在main 的之後嗎

你好 讓我來解決您的困惑 1 何謂宣告?何謂定義?宣告即是告訴編譯器我可能要在後面的 中會用到這個變數後者型別,此時編譯器是不為變數做記憶體分配的 定義即是用到宣告的變數或型別並為它做記憶體的分配 2 編譯器從檔案起始位置開始編譯,它如果沒有發現你做結構體的型別宣告,那麼當它在main 函式中碰到用...