c中struct 為什麼可以在資料結構這樣用?

時間 2021-06-01 13:37:33

1樓:

是的,「巢狀」指標型別是沒問題的。

在C中,各種型別的指標本身只是乙個位址值,長度都是一樣的。但是只知道位址值你是沒法確定往後多少bit是你真正有效的資料範圍,所以指標就要加型別來確定往後取得範圍。

所以你的struct裡面那個巢狀的東西只是乙個位址不是struct結構本身。到這裡你的編譯器是可以確認你整個結構體的大小的,你的例子中就是乙個int,乙個EdgeType,加乙個位址的長度。

其實這個struct位址你甚至可以不用給確定型別,你裡面宣告乙個void *也可以,只是用的時候再轉型成EdgeNode也可以。

例如:下面的例子,兩個EdgeNode夾乙個Node(next項void*,未指定型別)大小是一樣的,也可以連成鍊錶,由頭節點可以訪問next項,遍歷整個鍊錶。

#include

struct

EdgeNode

;struct

Node

;int

main

()結果:

12==

12body:40

50tail:1020

2樓:r00tk1t

1. typedef用於定義型別別名,這種寫法是C常見的一次性別名加結構體定義,省時省力。這裡的別名名稱似是而非,結構體是struct A,別名是A,當然,別名不一定非要叫A。

2. 先深入了解一下typedef就懂了。

3. 你的猜測是正確的,因為指標不算迴圈引用。

3樓:中玉

c語言和c++中的struct用法是有區別的,在c語言中typedef

struct

Node

Node

;相當於下面兩句話

struct

Node

;typedef

struct

Node

Node;//

給「struct

Node

」起個別名,叫

Node

由於在c中,宣告結構體變數必須帶上 struct,如:

struct

Noden1;

//不能直接寫

Noden1;

//c++才能這麼寫,但是使用

typedef之後就

「好像可以這麼寫了」

在語句 typedef struct Node Node; 之前,必須使用struct Node 來定義此結構體變數,直接使用Node 不合法。

再說說指標。

任何指標型別在本質上都是乙個無符號整數,就是說int *t 和struck Node *t在本質上是沒有區別的,在不能得知struck Node的具體結構,但已知struck Node是一種型別時,也可以直接定義它的指標;如:

#include

struct

Node

;//前置宣告,告訴編譯器這是一種型別

intmain

(int

argc

,char

const

*argv

)struct

Node

;可以順利執行。

4樓:石大頭

c語言struct不能迴圈定義,主要是因為編譯器要計算該struct的大小和記憶體布局。那麼存乙個指標顯然是沒問題的,不管什麼型別的指標都是一樣大

c 中為什麼push back 1,2 可以,emplace back 1,2 會報錯

邱昊宇 因為 本身什麼都不是,而你以為它是 std initializer list。它變身 std initializer list是有條件的 要麼是你在用 auto 推導這玩意兒的型別,要麼是你在做某種函式呼叫並且被呼叫的函式以 std initializer list 作為引數。而這裡的 em...

我們在數學中為什麼要引入複數?

IIA1900 虛數的存在支援著現代物理學 佚名1.光的折射率在初中我們學過 折射率 介質中的光速 真空中的光速 但是你知道物理學上還有 複折射率 嗎?觸及知識盲區 複折射率不僅能體現光折射,還能顯示光被吸收的效果。複折射率的實部就是傳統意義上的折射率,虛部則表示的是光被介質吸收的部分。在物理學裡,...

為什麼在數學教育中輕思維重技巧?

Nerd Keyboard 邏輯推理是基礎中的基礎,講起來很少人能相信或者理解。但是運用挺廣泛的,就比如如何證明程式能夠跑出正確的結果,如何證明明天下雨的概率是70 對於這些問題都有著自己的捷徑,但是並非普適的邏輯觀念。大概在現實裡,有限的時間內要解出乙個問題,這些捷徑比基礎邏輯更有價值些,而基礎邏...