1. 程式人生 > >C-C++語言結構體中定義另一個結構體指標的經驗

C-C++語言結構體中定義另一個結構體指標的經驗

本文進行討論的是,在Linux中,C/C++語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性,

比如

struct person
{
   int age;
   int height;
  //...  
};

這個結構一攜帶的就是一個人的兩個基本資訊,年齡(age)和身高(height),同樣你也可以繼續新增人的相關資訊進去,比如學號,班級等。

但是今天討論的是在結構體中定義一個結構體指標的問題,當然這也可以延伸到結構體定義一個普通型別的指標方面,讀者可以自行進行驗證或者思考,本文

不作討論。

typedef struct tagStudent_T
{
    int i_StuID;
    int i_StuClass;
}Student_T;

typedef struct tagSchool_T
{
    Student_T *student;
    int i_SchoolRank;
}School_T;

上述的兩個結構體表示的含義是:

第一個: 學生的個人資訊

第二個:學校的情況(包含了學生的資訊和學校的排名)

接下來,如果要對Statuend_T的結構體的變數進行設定,那麼有兩種方法,第一個直接使用Student_T定義的變數進行賦值,第二個就是使用School_T進行間接賦值,

今天就是討論第二種的方法。

首先,在一個程式執行過程中,實際上是記憶體指標在操作,因此我們定義School_T的指標*school,具體的操作如下程式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include 
<unistd.h> typedef struct tagStudent_T { int i_StuID; int i_StuClass; }Student_T; typedef struct tagSchool_T { Student_T *student; int i_SchoolRank; }School_T; int main(int argc,char const *argv[]) { School_T *school = (School_T *)malloc(sizeof(School_T)); if(NULL != school) { school
->i_SchoolRank = 1; //rank first /*由於School_T中定義的student是一個結構體指標,必須要對其進行分配記憶體*/ school->student = (Student_T *)malloc(sizeof(Student_T)); if(NULL != school->student) { school->student->i_StuID = 12345; school->student->i_StuClass = 5; } else { free(school); } } /*這兩個的free順序最好不要調轉,因為如果先free掉school的話,相當於將student得本體free了,相當於一個野指標 */ free(school->student); free(school); }

如果你不想使用這種方式,大可直接使用變數,不是指標類的變數,如School_T school。同樣School_T結構體重使用的也是一個普通的變數,即Student_T student,這樣,

你就不需要進行記憶體指標的操作。但是本人建議還是使用指標來進行,效率相對而言會更快一點。可以參考一些<C和指標>這本書

(注:上述的編譯只在Ubuntu下的Linux系統操作,其他的win,vs等沒有進行測試)

相關推薦

C-C++語言結構定義一個結構指標經驗

本文進行討論的是,在Linux中,C/C++語言的結構體的使用情況。一般情況下,結構體的使用還是相對比較簡單的,它攜帶的一類物體的某一些屬性, 比如 struct person { int age; int height; //... }; 這個結

c++一個定義一個帶引數建構函式的類的物件

c++中在一個類中定義另一個只有帶引數建構函式的類的物件,編譯通不過 class A {     public: A(int i){}     }; class B {     public: B(){}     private:    

C++在一個定義一個有引數建構函式的類的物件

class A{public:      A( int i ){}};class B {public:      B():a(1){}   //或:B( int i ):a( i ){ }。對a提供引數一定要按                  //這種形式,在冒號後,不能在

C語言學習筆記----伊能C語言學習筆記----如何在一個檔案使用一個檔案定義的變數呢??

 我們知道,一個大的程式,會由多個c檔案構成,這些c檔案是屬於同一個程式的。  那麼,如何在一個檔案中使用另一個檔案中定義的變數呢??      解答:    C語言為了解決這個問題:引出了    全域性作用域的概念  即:  在一個檔案中定義的全域性變數,具有全域性

結構定義變數時,出現冒號+數字的形式(位域定義

該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

C語言-傳陣列引數給一個函式,使用malloc

// // main.c // // // Created by myhaspl on 2018/10/26. // Copyright © 2018 [email protec

c#在一個視窗開啟一個視窗

1、今天功能需要,開啟新的視窗,這裡簡單記錄下2、實現機制,在主程式開啟第一個視窗,在第一個窗口裡面寫入觸發事件,開啟另一個視窗,並隱藏當前視窗3、實現程式碼段    建立兩個視窗 分別為  setParams 和 main    在主程式中預設開啟setParams視窗  

c#裡用一個視窗載入一個視窗的方法

不囉嗦,直接上程式碼,主窗體用一個public_panel來放另一個窗體AntennaCheck(窗體名),放在任意的地方,可以用button觸發,也可以在載入主窗體的時候同時出現,有人或許會問,為什麼要增加一個窗體,懟他曰:程式碼號管理唄!            An

c++在標頭檔案定義全域性變數時需要注意的地方

我們知道,在 C++(但不是在 C 語言)中,const 限定符對預設儲存型別稍有影響。在預設情況下,全域性變數的連結性為外部的,但 const 全域性變數的連結性為內部的。也就是說,在 C++ 看來,全域性 const 定義就像使用了 static 說明符一樣。

C++學習筆記-----在一個建構函式呼叫一個建構函式

在建構函式中呼叫另一個建構函式如果一不注意就會有無限遞迴的危險,而且建構函式的引數的不同也決定了呼叫的不同,所以特意總結了一下哪些形式的呼叫時允許的: 首先假設建構函式呼叫時引數都是外部的變數,而不是一個常量。 第一種,也是C++11支援的一種呼叫方式。在函式的初始化列表中

C#】WPF的xaml定義的Trigger為什麼有時候會不管用,如Border的MouseOver之類的

初學WPF,知道一些控制元件可以通過定義Style的Trigger改變要顯示的樣式,但是經常遇到一些明明Trigger已經觸發了,但是裡面Setter設定的樣式,卻沒有效果的問題。其實主要原因,是樣式

C++如何在一個建構函式呼叫一個建構函式

http://blog.chinaunix.net/uid-23741326-id-3385581.html 在C++中,一個類的建構函式沒法直接呼叫另一個建構函式,比如: 點選(此處)摺疊或開啟 #ifndef _A_H_ #define _A_H_ #i

C#在一個視窗開啟一個視窗,同時關閉該視窗

C#程式設計時,經常會遇到處理兩個或多個視窗的問題。以登入視窗為例,當登入視窗登入驗證成功後,要進入主視窗,此時需要關閉登入視窗,這時候用this.close()是不可以的。因為Program.cs中          static void Main()        

C#在一個程序呼叫一個程序後臺程序IsBackground

最近在做一個專案時,需要在一個程序中呼叫另一個程序,這裡記錄一下, 在msdn 上有一個簡介,上面的介紹:https://msdn.microsoft.com/en-us/library/system

結構定義函式指標

結構體指標變數的定義,定義結構體變數的一般形式如下: 形式1:先定義結構體型別,再定義變數 struct結構體識別符號 { 成員變數列表;… }; struct 結構體識別符號 *指標變數名; 變數初始化一:struct結構體識別符號 變數名={初始化值1,初始化值2,…

c++多個文件如何共用一個全局變量

calc 其它 pop 例子 頭文件 標準 關鍵字 word sin 例子: 頭文件:state.h 源文件:state.cpp 其它源文件:t1.cpp t2.cpp t3.cpp, 這些源文件都包含頭文件state.h。 需要定義一個全局變量

C#使用異步委托在一個線程上更新窗體不能省略可選參數

leg pos orm blog tar log 委托 () gin 使用button1更新label1: private delegate void UpdateFormInvoke(string a, string b = "B");

當函式使用結構指標變數作為引數時,如果結構嵌套了結構,應該如何呼叫其中的元素?

今天寫程式碼時突然遇到了這個問題,以前不曾探討過多層巢狀結構體指標變數的訪問,只知道結構體指標變數要訪問其元素時應該用 -> 來訪問,但對於結構體中巢狀有結構體的時候呢? 請看下面程式碼: #include “stdio.h” using namespac

指標指向結構的某一個元素的方法

#include <stdio.h> struct St_Test{ int t1; int t2; int t3; int t4; }; void main() { struct St_Test St_Test_Ex; str

C++primer第五版 編寫一個函式,令其接收兩個引數,一個是int型的數,一個是int指標。函式比較int的值和指標所指的值,返回較大的那個。

該題目主要是為了熟悉函式引數的幾種傳遞方式。定義函式形參時,可以定義成傳值(本身)、傳指標(*)、傳引用(&)。如果只是訪問引數值,不對其進行修改,那麼這三種方式都是可以的。例如該題目,就僅僅是比較兩個引數的大小,並沒有對引數本身進行修改,因此傳值和傳指標都是可行的。