C語言進階之路之結構體、枚舉關卡篇

目錄

????????一、學習目標

二、組合數據類型-結構體

?結構體基本概念

結構體的聲明:

小怪實戰

結構體初始化

指定成員初始化的好處:

結構體成員引用

結構體指針與數組

關卡BOOS

三、結構體的尺寸

CPU字長

地址對齊

結構體的M值

可移植性

四、聯合體-枚舉

聯合體基本概念

聯合體的定義:

聯合體的使用

枚舉

總結


一、學習目標

  • 掌握結構體的含義和用法
  • 理解結構體尺寸和可移植用法
  • 清楚枚舉的概念和用法

二、組合數據類型-結構體

????????結構體基本概念

????????C語言提供了眾多的基礎類型,但現實生活中的對象一般都不是單純的整型、浮點型或字符串,而是這些基礎類型的綜合體。比如一個學生,典型地應該擁有學號(整型)、姓名(字符串)、分數(浮點型)、性別(枚舉)等不同側面的屬性,這些所有的屬性都不應該被拆分開來,而是應該組成一個整體,代表一個完整的學生。

????????在C語言中,可以使用結構體來將多種不同的數據類型組裝起來,形成某種現實意義的自定義的變量類型。結構體本質上是一種自定義類型

????????結構體的聲明:

struct 結構體標簽
{成員1;成員2;.....
};  // 結尾處必須有分號作為結束 ; 
  • 語法:
    • 結構體標簽,用來區分各個不同的結構體,標簽可以省略,如果省略的話就無法直接定義該結構體類型的變量。
    • 成員,是包含在結構體內部的數據,可以是任意的數據類型(除了函數)。

  • 小怪實戰

    • 嘗試使用結構體的知識設計一個用于描述貓或其他東西的各項屬性,比如包含:顏色、重量、價值等
      • 定義一個自己設計的結構體類型變量
      • 從鍵盤中獲取對應的屬性并存入結構體中
      • 遍歷輸出機構體中的數據
      • 【拓展】嘗試使用結構體數組來存儲多個相同的事物

結構體初始化

????????結構體跟普通變量一樣,涉及定義、初始化、賦值、取址、傳值等等操作,這些操作絕大部分都跟普通變量別無二致,只有少數操作有些特殊性。這其實也是結構體這種組合類型的設計初衷,就是讓開發者用起來比較順手,不跟普通變量產生太多差異。

  • 結構體的定義和初始化
    • 由于結構體內部擁有多個不同類型的成員,因此初始化采用與數組類似的列表方式。
    • 結構體的初始化有兩種方式:
        • ①普通初始化(順序初始化) -- 寫起來方便簡潔一點
        • ②指定成員初始化 -- 對于后期的更新迭代具有較好的穩定性
    • 為了能適應結構體類型的升級迭代,一般建議采用指定成員初始化。
  • 示例:
// 1,普通初始化 struct node n = {100, 'x', 3.14}; 
// 2,指定成員初始化 struct node n = { .a = 100, 
// 此處,小圓點.被稱為成員引用符 .b = 'x', .c = 3.14 }
  • 指定成員初始化的好處:

    • 成員初始化的次序可以改變。
    • 可以初始化一部分成員。
    • 結構體新增了成員之后初始化語句仍然可用。

結構體成員引用

結構體成員引用符有兩個:

????????.? ? ?: 對普通的結構體變量的引用

????????->? : 對于結構體指針變量的引用

????????結構體相當于一個集合,內部包含了眾多成員,每個成員實際上都是獨立的變量,都可以被獨立地引用。引用結構體成員非常簡單,只需要使用一個成員引用符即可:

結構體變量.成員名

示例:

n.a = 200;
n.b = 'y'; 
n.c = 2.22; 
printf("%d, %c, %lf\n", n.a, n.b, b.c);

結構體指針與數組

跟普通變量別無二致,可以定義指向結構體的指針,也可以定義結構體數組。

  • 結構體指針:
struct node n = {100, 'x', 3.14}; 
struct node *p = &n; 
// 以下語句都是等價的 printf("%d\n", n.a); 
printf("%d\n", (*p).a); printf("%d\n", p->a); 
// 箭頭 -> 是結構體指針的成員引用符
  • 結構體數組:
struct node s[5]; 
s[0].a = 300; s[0].b = 'z'; 
s[0].c = 3.45;

結構體聲明語句的變形:

變形一:

????????在聲明結構體類型時,同時定義變量,可以定義普通變量也可以是指針變量,可以一次性定義多個或一個。

// 聲明結構體
struct node
{int Num ;char Name[32];char Type ;
} Even, *Ptr ;  
// 在聲明結構體類型的同時,定義了兩個變量,一個是結構體類型的變量 以及一個指針 (他們都屬于全局變量)

變形二:

????????聲明語句中省略了標簽,因此無法在程序中定義出來任何的關于這個類型的變量以及指針,只能通過聲明語句順便定義的變量或指針進行訪問

// 聲明結構體
struct
{int Num ;char Name[32];char Type ;
} Even , * Ptr ;  
// 以上結構體的聲明語句中省略了標簽,因此無法在程序中定義出來任何的關于這個類型的變量以及指針
// 只能通過聲明語句順便定義的變量或指針進行訪問

????????一般情況下不會輕易省略標簽,而是在結構體嵌套的情況下會進行省略


// 實際例子 (一般不會單獨出現在這樣子的結構體,而是會在結構體內部嵌套的小結構體中出現)
struct Stud
{int Num ;char Name [32];char Type ;struct {float Mathematics;float C;float Java ;}Achievement;
};

變形三:

????????在聲明語句中使用typedef 給結構體取別名,使得后面在使用結構體類型的時候不需要寫上struce Node 來定義變量而是可以直接使用別名來定義。


// 給 Int 取了一個別名 Even 
typedef  int Even;
typedef int * P_int ;typedef struct node
{int Num ;char Name[32];char Type ;
} Node, *P_Node ;  
// 以后的代碼中如果想要定義變量就有兩個方法:
// 1. struct node  a ;
// 2.     Node     a ;
// 以后代碼中想要定義結構體類型的指針可以:
// 1.  struct node * p ;
// 2.     P_Node     p ;
// 注意細節:
//    P_Node  *   p ;  // 當前p 為二級指針int main(int argc, char const *argv[])
{int Num ;  // 使用 int 定義一個變量Even Num1 ; // 使用 別名 Even 來定義一個變量struct node a ;  // 使用 struct node 定義一個變量 a Node a1 ; // 使用 別名 Node 來定義一個變量 a1 // 一級指針struct node * ptr ;Node * ptr1 ;P_Node ptr2 ;// 二級指針如何定義P_Node * ptr3 ;Node ** ptr4 ;struct node ** ptr5 ;P_int  ppp ;printf("ppp:%ld\n" , sizeof(ppp));return 0;
}

關卡BOOS

    • 嘗試自行編寫結構體數組、結構體指針、結構體指針數組的代碼實現:
      • 聲明
      • 定義,初始化
      • 訪問等操作
    • 編寫一個怪獸管理系統實現以下功能:
      • 定義一個有20個元素的結構體數組,從代碼中初始化一部分
      • 從鍵盤中獲取至少兩個怪獸的信息
      • 怪獸的信息有:名字 、 身高 、 輻射值 、 破壞力 、 防御值 等....
      • 把所有的怪獸信息進行輸出
      • 【拓展】根據指定屬性查找怪獸
      • 【拓展】修改指定怪獸的屬性信息
      • 【拓展】 刪除指定怪獸
      • 【拓展】 隨機收取一名幸運怪獸
      • 【拓展】 排序

三、結構體的尺寸

CPU字長

????????字長的概念指的是處理器在一條指令中的數據處理能力,當然這個能力還需要搭配操作系統的設定,比如常見的32位系統、64位系統,指的是在此系統環境下,處理器一次存儲處理的數據可以達32位或64位

地址對齊

????????CPU字長確定之后,相當于明確了系統每次存取內存數據時的邊界,以32位系統為例,32位意味著CPU每次存取都以4字節為邊界,因此每4字節可以認為是CPU存取內存數據的一個單元。

????????如果存取的數據剛好落在所需單元數之內,那么我們就說這個數據的地址是對齊的,如果存取的數據跨越了邊界,使用了超過所需單元的字節,那么我們就說這個數據的地址是未對齊的。

????????從圖中可以明顯看出,數據本身占據了8個字節,在地址未對齊的情況下,CPU需要分3次才能完整地存取完這個數據,但是在地址對齊的情況下,CPU可以分2次就能完整地存取這個數據。

總結:

????????如果一個數據滿足以最小單元數存放在內存中,則稱它地址是對齊的,否則是未對齊的。

????????地址對齊的含義用大白話說就是1個單元能塞得下的就不用2個

????????2個單元能塞得下的就不用3個。

????????如果發生數據地址未對齊的情況,有些系統會直接罷工,有些系統則降低性能

普通變量的m值

????????以32位系統為例,由于CPU存取數據總是以4字節為單元,因此對于一個尺寸固定的數據而言,當它的地址滿足某個數的整數倍時,就可以保證地址對齊。這個數就被稱為變量的m值。

????????根據具體系統的字長,和數據本身的尺寸,m值是可以很簡單計算出來的。

  • 舉例:
char   c; // 由于c占1個字節,因此c不管放哪里地址都是對齊的,因此m=1
short  s; // 由于s占2個字節,因此s地址只要是偶數就是對齊的,因此m=2
int    i; // 由于i占4個字節,因此只要i地址滿足4的倍數就是對齊的,因此m=4
double f; // 由于f占8個字節,因此只要f地址滿足4的倍數就是對齊的,因此m=4   如果是64為系統則m = 8 printf("%p\n", &c); // &c = 1*N,即:c的地址一定滿足1的整數倍
printf("%p\n", &s); // &s = 2*N,即:s的地址一定滿足2的整數倍
printf("%p\n", &i); // &i = 4*N,即:i的地址一定滿足4的整數倍
printf("%p\n", &f); // &f = 4*N,即:f的地址一定滿足4的整數倍
  • 注意,變量的m值跟變量本身的尺寸有關,但它們是兩個不同的概念。
  • 手工干預變量的m值:
char c __attribute__((aligned(32))); // 將變量 c 的m值設置為32

  • 語法:
    • attribute 機制是GNU特定語法,屬于C語言標準語法的擴展。
    • attribute 前后都是雙下劃線,aligned兩邊是雙圓括號
    • attribute 語句,出現在變量定義語句中的分號前面,變量標識符后面
    • attribute 機制支持多種屬性設置,其中 aligned 用來設置變量的 m 值屬性
    • 一個變量的 m 值只能提升不能降低,且只能為正的2的n次冪

結構體的M值

  • 概念:
    • 結構體的M值,取決于其成員的m值的最大值。即:M = max{m1, m2, m3, …};
    • 結構體的和地址尺寸,都必須等于M值的整數倍
  • 示例:
struct node
{short  a; // 尺寸=2,m值=2double b; // 尺寸=8,m值=4(32)   m=8(64)char   c; // 尺寸=1,m值=1
};struct node n; // M值 = max{2, 4, 1} = 4;
  • 以上結構體成員存儲分析:
  1. 結構體的M值等于4,這意味著結構體的地址、尺寸都必須滿足4的倍數。
  2. 成員a的m值等于2,但a作為結構體的首元素,必須滿足M值約束,即a的地址必須是4的倍數
  3. 成員b的m值等于4 / 8 ,因此在a和b之間,需要填充 2個字節 / 6個字節無效數據(一般填充0)
  4. 成員c的m值等于1,因此c緊挨在b的后面,占一個字節即可。
  5. 結構體的M值為4 /8,因此成員c后面還需填充 3個 / 7個 無效數據才能將結構體尺寸湊足 4 / 8 的倍數。

可移植性

可移植指的是相同的一段數據或者代碼,在不同的平臺中都可以成功運行

  1. 對于數據來說,有兩方面可能會導致不可移植
    1. 數據尺寸發生變化 (long 類型)
    2. 數據相對位置發生變化 (結構體中 排列)

第一個問題,起因是基本的數據類型在不同的系統所占據的字節數不同造成的,解決辦法是使用z之前通關秘籍的可移植性數據類型即可。

考慮結構體

struct node
{int8_t  a;int32_t b;int64_t d;  // 4  / 8int16_t c;
};

以上結構體,在不同的的平臺中,成員的尺寸是固定不變的,但由于不同平臺下各個成員的m值可能會發生改變4->8,因此成員之間的相對位置可能是飄忽不定的,這對數據的可移植性提出了挑戰。

解決的辦法有兩種:

  • 第一,固定每一個成員的m值,也就是每個成員之間的塞入固定大小的填充物固定位置:
struct node
{int8_t  a __attribute__((aligned(1))); // 將 m 值固定為1int64_t b __attribute__((aligned(8))); // 將 m 值固定為8int16_t c __attribute__((aligned(2))); // 將 m 值固定為2
};
  • 第二,將結構體壓實(取消結構體內部的地址對齊),也就是每個成員之間不留任何空隙:
struct node
{int8_t  a;int64_t b;int16_t c;
} __attribute__((packed));

實例:

#include <stdio.h>struct node
{short  a; // 尺寸=2,m值=2char   c; // 尺寸=1,m值=1double b; // 尺寸=8,m值=4(32)   m=8(64)
}  ;struct test  // 8
{char c1 ; // 1int i1 ; //  4short s1 ; // 2double d1 ; // 8short s2 ; //2 
};typedef struct Transplantation  // 8
{__int8_t c1 ; // 1__int32_t i1 ; //  4__int16_t s1 ; // 2double d1 ; // 8__int16_t s2 ; //2 
} __attribute__((packed)) Node , *P_Node  ;int main(int argc, char const *argv[])
{printf("%ld\n" , sizeof( struct node ));  // 16printf("%ld\n" , sizeof( struct test ));  //32printf("%ld\n" , sizeof( Node ));  //17return 0;
}

零長數組:

????????概念: 長度為0的數組,一般可以把數組放在結構體的最后一個成員,用于通過它來進行越界訪問可能會出現在結構體后面的拓展內存空間。

實際例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct Node
{int Num ;char Name[32];int Len ;   // 用于描述 多申請空間的大小字節數char Msg[0] ; // 零長數組用于訪問結構體后面多申請的內存空間} Node  , * P_Node ;int  main( int argc , const char ** argv )
{static int arr[0];printf("%ld\n" , sizeof(arr));printf("%p\n" , arr);//                申請結構體的堆內存 時多申請10個字節P_Node ptr = calloc( 1 , sizeof (Node) + 10  );ptr->Len = 10 ;  //  設置len 為10 表示 結構體 后 多申請了10 字節ptr->Num = 34 ;
//    ptr->Name = "123"strncpy( ptr->Name , "Even" , 32 ); // 32表示最多拷貝32字節(除非遇到結束符)
//    memcpy( ptr->Name , "Even" , 5 ); // 5表示必須拷貝5字節// 通過零長數組來訪問多申請的合法內存scanf("%s" , ptr->Msg);printf("Name:%s Num:%d msg:%s\n" ,ptr->Name , ptr->Num , ptr->Msg);return  0;
}

四、聯合體-枚舉

聯合體基本概念

????????聯合體的外在形式跟結構體非常類似,但它們有一個本質的區別:結構體中的各個成員是各自獨立的,而聯合體中的各個成員卻共用同一塊內存,因此聯合體也稱為共用體。

聯合體各成員的堆疊效果

聯合體內部成員的這種特殊的“堆疊”效果,使得聯合體有如下基本特征

  • 整個聯合體變量的尺寸,取決于聯合體中尺寸最大的成員
  • 給聯合體的某個成員賦值,會覆蓋其他的成員,使它們失效。
  • 聯合體各成員之間形成一種“互斥”的邏輯,在某個時刻只有一個成員有效

聯合體的定義:

union 聯合體標簽
{成員1;成員2;...
};
  • 語法:
    • 聯合體標簽,用來區分各個不同的聯合體。
    • 成員,是包含在聯合體內部的數據,可以是任意的數據類型。
// 普通初始化:第一個成員有效(即只有100是有效的,其余成員會被覆蓋)
union attr at = {100, 'k', 3.14};// 指定成員初始化:最后一個成員有效(即只有3.14是有效的,其余成員會被覆蓋)
union attr at = {.x  = 100,.y = 'k',.z = 3.14,
};

聯合體操作

????????聯合體的操作跟結構體形式上別無二致,但由于聯合體特殊的存儲特性,不管怎么初始化和賦值,最終都有且僅有一個成員是有效的。

  • 初始化:
// 普通初始化:第一個成員有效(即只有100是有效的,其余成員會被覆蓋)
union attr at = {100, 'k', 3.14};// 指定成員初始化:最后一個成員有效(即只有3.14是有效的,其余成員會被覆蓋)
union attr at = {.x  = 100,.y = 'k',.z = 3.14,
};

成員引用

at.x = 100;
at.y = 'k';
at.z = 3.14; // 只有最后一個賦值的成員有效printf("%d\n", at.x);
printf("%c\n", at.y);
printf("%lf\n", at.z);

指針引用

union attr *p = &at;
p->x = 100;
p->y = 'k';
p->z = 3.14;  // 只有最后一個賦值的成員有效printf("%d\n", p->x);
printf("%c\n", p->y);
printf("%lf\n", p->z);

聯合體的使用

????????聯合體一般很少單獨使用,而經常以結構體的成員形式存在,用來表達某種互斥的屬性。

  • 示例:
struct node
{int a;char b;double c;union attr at; // at內有三種互斥的屬性,非此即彼
};int main()
{struct node n;n.at.x = 100; // 使用連續的成員引用符來索引結構體中的聯合體成員
}

字節序:

????????計算機在存儲多個字節的數據時,使用什么存儲策略:

      • 把低有效位存儲于低地址
      • 把高有效位存儲與低地址

帶來的問題:

在不同字節序的計算機中傳遞多字節的數據可能會造成誤會。

枚舉

????????枚舉類型的本質是提供一種范圍受限的整型,比如用0-6表示七種顏色,用0-3表示四種狀態等,但枚舉在C語言中并未實現其本來應有的效果,直到C++環境下枚舉才擁有原本該有的屬性。

  • 枚舉常量列表
    • enum是關鍵字
    • spectrum是枚舉常量列表標簽,可以省略。省略的情況下無法定義枚舉變量
enum spectrum{red, orange, yellow, green, blue, cyan, purple};
enum         {reset, running, sleep, stop};
  • 枚舉變量
enum spectrum color = orange; // 等價于 color = 1
  • 語法要點:
    • 枚舉常量實質上就是整型常量首個枚舉常量默認為0
    • 聲明枚舉常量列表時可以賦值,若不賦值,則取其前面的枚舉常量的值加1
    • C語言中,枚舉等價于整型,支持整型數據的一切操作
switch(color)
{case red:// 處理紅色...case orange:// 處理橙色...case yellow:// 處理黃色...   
}

枚舉數據最重要的作用,是使用有意義的單詞,來替代無意義的數字,提高程序的可讀性。

總結

? ? ? ? 本文細講了打怪路上的結構體、聯合體等BOSS,各位只需認真學習,即可消滅攻破它們。祝各位都可爬上C語巔峰,斬盡攔路小妖。

? ? ? ? 本文參考 粵嵌文哥 的部分課件,經過整理和修改后發布在C站。如有轉載,請聯系本人

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210933.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 使用冒號的七種方式

在 Java 中&#xff0c;冒號字符&#xff08;:&#xff09;用于不同的上下文&#xff0c;并根據上下文的不同而具有不同的含義。 以下是 Java 中冒號的一些常用用法&#xff1a; 1、三元運算符 冒號在三元運算符 (? :) 中用作條件、條件為真時要執行的表達式和條件為假時要執…

計算機視覺 基于Open3D了解用于網格和點云鄰域分析的KD樹和八叉樹

一、簡述 距離計算和鄰域分析是理解網格和點云的形狀、結構和特征的重要工具。我們這里要基于一些3D庫來提取基于距離的信息并將其可視化。 與深度圖或體素相比,點云和網格表示 3D 空間中的非結構化數據。點由它們的 (X, Y, Z) 坐標表示,在 3D 空間中可能彼此靠近的兩…

Python數據科學視頻講解:數據清洗、特征工程和數據可視化的注意事項

1.6 數據清洗、特征工程和數據可視化的注意事項 視頻為《Python數據科學應用從入門到精通》張甜 楊維忠 清華大學出版社一書的隨書贈送視頻講解1.6節內容。本書已正式出版上市&#xff0c;當當、京東、淘寶等平臺熱銷中&#xff0c;搜索書名即可。內容涵蓋數據科學應用的全流程…

深入理解HTTP協議中的GET、POST、DELETE和PUT方法

在Web開發中&#xff0c;我們經常需要與服務器進行交互&#xff0c;以獲取或發送數據。為了實現這一目標&#xff0c;我們使用HTTP協議。HTTP協議是一種無狀態的、應用層的協議&#xff0c;它定義了客戶端和服務器之間的通信方式。在HTTP協議中&#xff0c;有四種常用的請求方法…

MN316 OpenCPU丨HTTP使用介紹

HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;即超文本傳輸協議&#xff0c;是一個簡單的請求-響應協議&#xff0c;通常運行在TCP之上&#xff0c;它指定了客戶端可能發送給服務器消息類型以及得到什么類型響應。HTTPS&#xff08;Hyper Text Transfer Protoc…

uniapp使用v-html調用接口,富文本圖片 視頻自適應大小

前端獲取到后臺數據 不做處理 就會出現下面問題 圖片 視頻超出視圖顯示不全 處理 //info 是富文本 <view v-ifinfo v-htmlreplaceWhite(info)></view>調用下面方法 replaceWhite(html) { // 處理富文本默認圖片&#xff0c;視頻大小let newContent html.replace…

Nestjs聯合Typeorm操作Mysql數據庫

創建項目 // 安裝腳手架(只需要安裝一次,因為這個是全局的) npm i -g nestjs/cli // 創建項目 nest new project-name // (該過程有個選擇包管理工具的,我選的yarn)啟動項目 yarn run start:dev // 可以在瀏覽器訪問localhost:3000 輸出helloWorld安裝typeorm,mysql2和nestj…

藍橋小白賽1

&#x1f469;?&#x1f3eb; 地址 1. 蘑菇炸彈 &#x1f469;?&#x1f3eb; 蘑菇炸彈 &#x1f389; AC code import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc new Scanner(System.in);int n sc.nextInt();int[] a …

d8week17

Week7 lec17 TVD去asscess model &#xff08;本質 距離加權平均&#xff09;text 11.2A New Statistic: The Distance between Two Distributions text-11.11.1 數據拿到手&#xff0c;套路操作 -- 看hist分布2 total variation distance lec18lec19 lec17 TVD去asscess model…

使用NCNN在華為M5部署Yolov5

使用NCNN在華為M5平板部署Yolov5 一、NCNN二、下載解壓NCNN三、下載ncnn-android-yolov5工程四、下載Android Studio[前提已經配置了jdk版本]1、安裝NDK、Cmske&#xff0c;這個必須要安裝&#xff0c;2、安裝Android 五、構建工程六、修改源碼七、重新ysnc project八、安裝APP…

MySQL深入——8

Order by語句是如何工作的&#xff1f; 首先我們來創建一個表 CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAULT NULL,PRIMARY KEY (id),KEY city (city) ) ENGINEInnoDB; 全字段…

SQL命令---刪除數據表

介紹 使用sql語句實現刪除數據表。 命令 drop table 表名;

Python實戰演練之python實現神經網絡模型算法

python實現神經網絡模型算法 今天&#xff0c;厾羅和大家分享用Python實現神經網絡模型算法&#xff0c;僅用于技術學習交流。 實現技巧 1.導入依賴庫 主要是安裝相關的依賴庫。本文實現的環境為&#xff1a;python 3.7。 from __future__ import division import math …

C語言聯合體

聯合體 聯合體聯合體基本概念聯合體特點聯合體內存結構圖 聯合體 聯合體基本概念 聯合體概念&#xff1a; 結構體&#xff08;struct&#xff09;是一種結構體類型或者復雜類型&#xff0c;它可以包含多個類型不同的成員另外一種和結構體非常類似的類型&#xff0c;叫做聯合…

GPT-4 變懶了?官方回復

你是否注意到&#xff0c;最近使用 ChatGPT 的時候&#xff0c;當你向它提出一些問題&#xff0c;卻得到的回應似乎變得簡短而敷衍了&#xff1f;對于這一現象&#xff0c;ChatGPT 官方給出了回應。 譯文&#xff1a;我們聽到了你們所有關于 GPT4 變得更懶的反饋&#xff01;我…

在HTML中插入音頻和視頻(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹在HTML中插入音頻和視頻以及部分理論知識 &#x1f349;歡迎點贊 &#x1f44d; 收藏 ?留言評論 &#x1f4dd;私信必回喲&#x1f601; &#x1f349;博主收將持續更新學習記錄獲&#xff0c;友友們有任何問題可以在評論區留言 …

外匯交易中的MT4軟件優勢:解析軟件對交易的影響!

近年來&#xff0c;隨著金融科技的不斷發展&#xff0c;MT4軟件作為外匯交易領域的領先平臺&#xff0c;備受交易者青睞。本文將探討MT4軟件在外匯交易中的優勢以及對交易的影響&#xff0c;幫助讀者深入了解這一交易利器。 ### 1. MT4軟件概述 MetaTrader 4(簡稱MT4)是一款由M…

深度學習 時間序列回歸學習筆記

目錄 常用的深度學習時間序列回歸模型: ARIMA模型 ETS模型 效果評估

低多邊形3D建模動畫風格紋理貼圖

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

【Linux】make/Makefile --- 自動化構建項目的工具

目錄 一、make/Makefile的簡單使用 二、Makefile 的語法規則 三、實現的原理 3.1 make/Makefile識別文件新舊 3.2 .PHONY修飾的偽目標總是被執行 3.3 make/Makefile是具有依賴性的推導能力的 四、語法技巧 五、注意事項 Linux中自動化構建項目最簡單的方式&#xff1a;…