C語言結構體為什麼可以定義自己的指標,和函式指標,而不能定義自己型別的變數呢?請教大拿

時間 2022-09-30 19:16:21

1樓:匿名使用者

因為自己型別的變數在這個型別中定義時,是不完整型別,除非你完成定義,不然不會知道這個型別的大小,而且本身巢狀本身,就等於是無窮遞迴的了。

但指標就不同了,c語言的指標大小是4個位元組,他只是指向乙個位址,和其他的全部無關,他不需要知道自己型別有多大,有怎樣的結構什麼的,這些都不是他該關心的,他只要指向乙個正確的位址就ok了,這就是指標的職責。定義指標是確定,不會影響該型別的結構,也不會出現無窮遞迴,所以在結構體中定義自身指標是合法的。

2樓:

c語言結構型別變數的定義是分兩個步驟完成的:

步驟一定義結構資料型別,例如:struct dataset ;

這個定義僅僅定義了乙個結構資料型別的組織形式,定義後它的作用就和系統中的int、float相同,是用來定義變數的說明符。

步驟二,利用已經定義好的結構資料型別定義結構型別的變數,例如:struct dataset x1,*x2; 這裡定義了兩個struct dataset 資料型別的變數,x1是結構型別變數,x2是結構型別的指標變數。

按c的語法規定上述兩個步驟也可以在乙個語句中完成,但是各自的作用仍然不變,例如:

struct dataset

x1, *x2;

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樓:樂跑小子

只能給那個函式傳個引數

struct cat ;

void cat_voice(struct cat* c)int main()

8樓:彭珂的課堂

c語言_071_指標的定義和使用_上

c語言結構體定義

9樓:苑餘殷運浩

結構體就像陣列一樣,其中的資料是有互相聯絡的,有些情況下定義一些簡單的變數是不能反映出資料之間的內在聯絡,所以我們就把這些資料組合成乙個項,而這個項中包含著很多不同的資料項,這就是結構體。

簡單理解下,就是說把一些有內在聯絡的不同變數放在一起封裝成乙個整體,這就是結構體。

指標,其實就是乙個存放位址的變數,指標可以指向變數,陣列,結構體等資料所在的記憶體單元。

指標就是用來通過位址去找資料的,只要你把該資料的位址給指標,那麼當你用到指向這個資料的指標時就等於在使用該資料。

10樓:

第二個struct student是定義了乙個student結構體,這個明白吧。

第乙個是用typedef把struct student這個結構體型別名字重新定義為student,也就是說struct student和student表示同乙個事物,都是乙個型別的識別符號,比如 typedef int zhengshu; 就是你把整型int重新命名為zhengshu,下面定義:int i; 和 zhengshu i; 兩句就是等價的了

11樓:

第一種是定義乙個結構體並取個student結構體名,下次定義結構體是:

只要:student 《識別符號》; 乳student stu;

而第二種:必須這樣定義:struct student stu;

12樓:匿名使用者

網頁鏈結看這個,茅塞頓開

13樓:匿名使用者

您參考這裡

14樓:匿名使用者

#include "stdio.h"

#include "string.h"

#define n 50

struct infoma;

struct infoma funname(struct infoma namet)

struct infoma allname(struct infoma namet)

void putout(struct infoma namet)main()

15樓:巧克力

第一種並沒有什麼意義,typedef為結構體student名定義乙個別名,應該與student不一樣,例如:stu,將student重定義為student挺搞笑的。

而第二種只是單純的定義了乙個結構體student。也可以在後面加上:typedef student stu。

16樓:傳說中的不死神

答案太亂了,其實你是不明白typedef的用法。

簡單地說:舉例定義無符號整形變數方法有兩種unsigned    int vault_a;

typedef unsigned int      def_uintdef_uint   vault_a;

這兩種方法都可以定義了 vault_a為無符號整形變數。

c語言中關於結構體指標為什麼不能在函式內賦初值的問題?

17樓:

struct st1*pst1; //問題在這句,這個指標pst1指向的型別是st1,而不是st,所以pst1 = &st1是不可以的,自然 pst1->num也就不對了

#include

struct st

st1 = , st2;

struct st*pst1; //是st*,而不是st1*void main()

18樓:gta小雞

賦值語句屬於執行語句,必須寫在函式體裡,不能寫在全域性區。

19樓:最大的寶寶

型別和變數名是不同的,要區分開來

這個c語言結構體鍊錶為什麼已經定義了結構體型別的指標,還要再malloc呢?

20樓:自我程式設計

指標必須初始化指向乙個記憶體位址。或者=null,否則就是野指標!

slist是乙個結構型別,定義該型別變數當然要初始化了。

malloc就是給這個指標申請了乙個結構大小的記憶體空間讓它指向。

否則你引用不了指標指向的位址。

注意malloc申請的記憶體,不會自動釋放,不用的化需要用free釋放掉。

c語言結構體求解,C語言結構體求解。。

兩個資料之間沒有分隔符,可以做如下修改 同理,你下面的printf兩個資料之間最好也加上分隔符 stu 0 score 0 stu 0 score 1 stu 0 score 2 a stu 1 score 0 stu 1 score 1 stu 1 score 2 b stu 2 score 0 ...

c語言結構體型別,C語言結構體型別

遞迴是呼叫自身,資料結構裡的鍊錶定義裡邊是結構體指標,而非結構體自身,不是遞迴呼叫。線性表單鏈表並沒有遞迴呼叫啊,他是用指標指向下乙個鍊錶struct lnode next 你去在理解下遞迴思想。呵呵,前面的都沒說到問題的本質.建議你先去了解下什麼是指標,什麼是指標變數.因為指標變數是存放指標的,並...

c語言結構體初始化,C語言結構體裡的結構體怎麼初始化

你已經定義了乙個mem1,下一句又定義了乙個mem1,所以它會提示你多次定義了,應該把第二個struct mem去掉吧 struct mem mem1 變成 mem1 估計是vc6.0 把它當做c 來處理了 一眼就看出問題了。去掉倒數第三行 mem1 前面的struct mem 就解決了 c語言結構...

結構體可以巢狀定義嗎,c語言結構體可以隨意巢狀結構體麼?

類定義中巢狀結構體是可以的,這裡要分幾種情況說明 對於已經宣告的 在類外 結構體型別,在類定義內巢狀結構體變數,沒有任何問題。在類定義內直接定義結構體型別並同時宣告結構體變數,也是可以的,但這個結構體型別無法在類外使用。在類內只定義結構體型別,而不同時宣告結構體變數是不可以的 這個在結構體定義內同樣...

C語言基礎結構體問題!跪求,C語言基礎結構體問題!跪求!!!

include include struct people int main int i,temp,k for i 0 i 4 i for i 1,k 0,temp p 0 point i 4 i if p i point typedef struct playerplayer 定義這樣的結構體,給...