嵌入式八股文面試題(一)C語言部分

1. 變量/函數的聲明和定義的區別?

(1)變量

????????定義不僅告知編譯器變量的類型和名字,還會分配內存空間。

int x = 10;  // 定義并初始化x
int x;   //同樣是定義

?????????聲明只是告訴編譯器變量的名字和類型,但并不為它分配內存空間。使用extern來修飾。告訴編譯器這個變量的定義在其他地方,這里使用此變量。

extern int x;  // 聲明x是一個整型變量

(2)函數

????????函數定義提供了函數的具體實現,它包括了函數的返回類型、函數名、參數類型以及函數體的內容。

int add(int a, int b) {return a + b;  // 函數體
}

????????函數聲明告知編譯器函數的返回類型、函數名及其參數類型,但并不提供函數的具體實現。

int add(int a, int b);  // 聲明add函數

?2. sizeof和strlen的區別?

(1) sizeof 是一個操作符(與<、>類似),而 strlen 是一個庫函數(在#inlcude <string>中)。

(2)sizeof 的參數可以是任何數據類型或變量,而strlen?只能是以‘ \0 ’結尾的字符串作為參數。

(3)編譯器在編譯時就計算出了sizeof的結果,而strlen 函數必須要在運行時才會被計算出來,其核心是因為strlen?是通過遍歷字符串,在遇到 ‘\0’ 就會結束(結果大小不包含‘\0’),而sizeof 則會將其包含在內計算大小。

char str[] = "Hello";
printf("sizeof(str) = %zu\n", sizeof(str));  // 輸出6(包括'\0')
printf("strlen(str) = %zu\n", strlen(str));  // 輸出5(不包括'\0')

?3. &的用法:引用和取地址。

(1)& 用作取地址符號:表示獲取變量的內存地址。

int x = 10;
int *ptr = &x; ?// 使用 & 獲取 x 的地址,并賦給指針 ptrprintf("x 的地址:%p\n", (void*)&x); ?// 輸出 x 的內存地址

(2)& 用作引用符號:表示一個變量的引用,即該變量的別名。創建一個引用,引用是變量的別名,它不會創建新的內存空間,而是直接使用原變量的內存。

int x = 10;
int& ref = x;  // ref 是 x 的引用,兩個變量共享相同的內存地址ref = 20;  // 通過引用修改 x 的值
printf("x = %d\n", x);  // 輸出 x = 20,引用修改了原變量

?4. static關鍵字。

????????static關鍵字可以修飾變量和函數,對此有著不同給功能。static修飾的變量默認初始化值為0。

變量

(1)在函數內部定義的變量。

????????當 static 用于函數內部的局部變量時,它表示該變量的生命周期改變。

????????局部變量通常在每次函數調用時被創建并銷毀,但使用 static 關鍵字后,局部變量在函數調用結束后不會銷毀,而是保留其值,直到下一次函數調用時繼續使用上一次的值。直到程序結束后銷毀。

void count_calls() {static int count = 0;  // 靜態變量,只初始化一次count++;printf("This function has been called %d times.\n", count);
}int main() {count_calls();  // 輸出: This function has been called 1 times.count_calls();  // 輸出: This function has been called 2 times.return 0;
}

(2)在函數外部定義的變量。

????????當 static 用于函數外部的變量或函數時,它限制了該變量或函數的作用域,使得它只能在當前文件中使用,無法被其他文件訪問。對于被static修飾全局變量來說,其他文件無法通過 extern 來引用它。

函數

?????????當 static 用于函數時,它限制了該函數的作用域,使得它只能在當前文件中使用,無法被其他文件訪問。(即只能在當前的C文件中使用,其他文件中無法調用該函數)

????????注意:在多線程程序中,使用 static 變量時要小心,因為它們的值會在多個線程之間共享,可能會引發競態條件。為了保證線程安全,通常需要使用同步機制(如互斥鎖)來訪問這些靜態變量。

5. volatile關鍵字。

????????在 C 和 C++ 中,volatile 是一個非常重要的關鍵字,它告訴編譯器不要優化該變量的讀取或寫入操作。例如,減少不必要的變量讀取或寫入,以提高程序的效率。但是,對于某些變量,如硬件寄存器或多線程共享變量,編譯器優化可能導致程序行為不符合預期。因此,volatile 被用來告訴編譯器:不要對該變量進行優化,每次訪問該變量時,都必須從內存中讀取最新的值。

????????場景:對硬件寄存器進行訪問時,都要加上此關鍵字。

#define STATUS_REGISTER (volatile int*)0x40001000int main() {int status = *STATUS_REGISTER;  // 硬件寄存器的讀取,每次都要從內存重新讀取// 其他代碼
}

6. const關鍵字。?

????????在 C 和 C++ 中,const 關鍵字用于聲明常量或表示某個對象的值不能被修改。const 提供了一種有效的方式來增強程序的可讀性、可維護性以及避免意外的修改。常見的有限制常量、指針、數組、函數參數等的修改性。

(1)常量

const int x = 10;  // x 是常量,值不能被修改
x = 20;  // 錯誤:無法修改常量變量 x

(2)指針

????????常量指針:指向常量數據的指針,const 放在 * 之前,表示指向的數據是常量。

????????作用:即通過這個指針你不能修改它所指向的數據,但指針本身可以指向其他內存位置。

const int *ptr = &x;  // ptr 是指向常量 int 的指針,不能通過 ptr 修改 x 的值
*ptr = 20;  // 錯誤:不能通過 ptr 修改值
ptr = &y;   // 合法:可以讓 ptr 指向其他位置

????????指針常量:指的是指針本身是常量,const 放在 * 之后,表示指針本身是常量。

????????作用:即你不能改變指針指向的地址,但指針所指向的數據可以被修改。

int x = 5;
int y = 10;
int *const ptr = &x;  // ptr 是常量指針,指向 x*ptr = 20;  // 合法:可以通過 ptr 修改 x 的值
ptr = &y;   // 錯誤:不能改變 ptr 的值(即不能讓 ptr 指向 y)

????????常量指針指向常量:既不允許修改指針的值(即指針常量),也不允許修改指針所指向的數據(即指向常量的數據)。

const int *const ptr;  // ptr 是常量指針,指向常量 int

(3)數組

????????使用 const 可以確保數組中的元素在程序執行過程中保持不變。

const int arr[] = {1, 2, 3, 4};  // arr 中的元素是常量,不能修改
arr[0] = 10;  // 錯誤:不能修改 arr 中的元素

(4)函數參數

????????在函數參數中使用 const,可以確保函數不會意外修改傳入的參數,特別是對于指針或引用類型的參數。這有助于增加代碼的可維護性和安全性。

void print(const int &x) {printf("%d", x);  // 不能修改 x
}void foo(const int *ptr) {*ptr = 10;  // 錯誤:不能修改 ptr 指向的數據
}

7. inline關鍵字。?

????????在 C/C++ 中,inline 關鍵字用于請求編譯器將函數的代碼插入到調用該函數的地方,而不是通過傳統的函數調用機制(即通過棧保存返回地址、傳遞參數等)。它的目的是提高代碼的執行效率,特別是對于那些調用頻繁且函數體較小的函數。遞歸函數不能內聯。

#include <iostream>inline int square(int x) {return x * x;
}int main() {int a = 5;int result = square(a);  // 在這里會將 square(a) 展開為 a * astd::cout << result << std::endl;  // 輸出 25return 0;
}

????????編譯器會盡可能地將內聯函數的代碼嵌入到調用點。但是如果內聯函數太復雜,編譯器可能不會進行內聯優化,盡管我們聲明了 inline。編譯器有最終決定權,可能會忽略 inline 關鍵字的請求。?

    8. C中的 malloc 和C++中的 new 有什么區別?

    在 C 和 C++ 中,mallocnew 都用于動態內存分配,但它們有一些重要的區別。

    (1)new、delete是操作符,可以重載,只能在C++中使用。而 malloc、函數 free是函數,在C++和C中都可以使用,在stdlib頭文件中。

    (2)new 在?C++ 中它不僅分配內存,還會調用類的構造函數,delete調用類的析構函數(如果是類類型的話)。而 malloc 和 free 函數僅僅是分配內存和釋放內存,并不執行構造和析構函數。

    (3)new、delete返回的是某種數據類型的指針,而malloc和free返回的是void類型的指針(因此需要強制類型轉換)。

    (4)malloc申請的內存要使用free來釋放,new申請的內存要使用delete來釋放,兩者不能混用,因為底層實現原理不同。

    (5)malloc申請內存失敗時會返回NULL,所以判斷返回值來判斷內存是否申請成功。而new申請內存失敗時會拋出異常。

    int* arr = (int*)malloc(10 * sizeof(int));  // 分配 10 個整數的空間
    free(arr);  // 釋放內存int* arr = new int[10];  // 分配 10 個整數的數組,自動初始化
    delete[] arr;            // 釋放數組,自動調用析構函數

    9. 程序中的內存分配方式。

    (1)棧區:對于所有的局部變量(除了局部靜態變量),都存儲在棧區中,棧內存的分配和釋放由編譯器自動管理,不需要程序員顯式調用。

    (2)堆區:使用malloc/new創建的內存都存儲在堆區,需要程序員手動創建和釋放。如果分配的內存,使用完成后就必須要記得釋放,不然會造成內存泄漏的風險!

    (3)靜態存儲區:用于存放全局變量和靜態變量,內存在程序編譯時就已經分配好了,這塊內存在程序整個運行期間都存在。

    ?10. 什么是野指針,如何避免?

    ????????野指針(Dangling Pointer)是指指向已經被釋放或未初始化的內存位置的指針。野指針是指針操作中常見的錯誤之一,它會導致程序崩潰、內存泄漏或者不預期的行為。平時使用時一定要避免野指針的情況。如下所示:

    // 1. 使用銷毀的指針
    int *ptr = new int(10);  // 在堆上分配內存
    delete ptr;               // 釋放內存
    // ptr 現在是一個野指針,因為它指向已釋放的內存//第二種情況:
    int* createPointer() {int x = 10;  // 局部變量 xreturn &x;  // 返回指向 x 的指針
    }
    int main() {int* p = createPointer();  // p 指向局部變量 xprintf("%d\n", *p);  // 試圖訪問已超出作用范圍的變量return 0;
    }
    /* 原因:局部變量在函數執行完畢后銷毀,指針p獲取到的是銷毀空間的變量,會導致崩潰*/// 2. 使用未初始化的指針
    int *ptr;  // 未初始化的指針
    *ptr = 10; // 訪問未初始化的指針,導致未定義行為// 3. 超過作用域。
    

    野指針的產生原因及解決辦法如下:

    (1)指針變量未初始化。解決辦法:指針聲明時初始化,可以是具體位置,也可以指向NULL。

    int *ptr = NULL;  // C語言中使用NULL初始化
    

    (2)使用被free或delete釋放的指針。解決辦法:指針指向的內存空間被釋放后,應該指向NULL。

    int *p=(int *)malloc(sizeof(int));
    free(p);p=NULL;
    

    (3)指針越界。解決辦法:在變量的作用域結束前釋放掉變量的地址空間并且指向NULL。

    ?11.?什么是函數指針和指針函數?

    (1)函數指針

    ????????是指向函數的指針。可以通過它調用函數,使得程序在運行時能夠動態地決定調用哪個函數。這在實現回調函數、函數數組等情況下非常有用。

    定義一個函數指針:

    返回類型 (*指針變量名)(參數類型1, 參數類型2, ...);
    

    使用舉例:?

    #include <iostream>// 定義一個普通函數
    int add(int a, int b) {return a + b;
    }int main() {// 聲明一個指向函數的指針int (*func_ptr)(int, int);// 將指針指向 add 函數func_ptr = &add;// 通過函數指針調用函數int result = func_ptr(3, 4);  // 調用 add(3, 4)std::cout << "Result: " << result << std::endl;  // 輸出 7return 0;
    }
    

    (2)指針函數

    ? ? ? ? 指返回指針的函數。它是一個普通的函數,只是返回值類型是一個指針。

    返回類型 *函數名(參數類型1, 參數類型2, ...);
    

    12. 指針的大小。

    ????????在 C/C++ 中,指針的大小是由編譯器和系統架構決定的。指針本身的大小與它所指向的數據類型(intdoublechar 等)無關,而是與計算機的位數有關。在 32 位系統中,指針通常占 4 字節(32 位),在 64 位系統中,指針通常占 8 字節(64 位)。

    13. 內存對齊。

    ? ? ? ? 內存對齊指計算機中數據在內存中的存儲方式,確保數據結構的成員按照特定規則排列,以提高訪問效率。?

    (1)為什么要進行內存對齊?

    ????????CPU訪問內存時,如果數據地址是對齊的(比如4字節對齊),那么訪問速度會更快。如果數據沒有對齊,可能需要多次訪問內存,甚至導致錯誤。尤其是在不同的硬件平臺上,對齊要求可能不同,所以編譯器會自動進行內存對齊優化。

    (2)對齊規則。

    ???????通常,每個數據類型的對齊要求是其自身的大小。比如,int通常是4字節,所以它需要4字節對齊;double是8字節,需要8字節對齊。結構體的對齊要求則是其成員中最大的對齊值。結構體的總大小需要是對齊值的整數倍,所以在成員之間可能會插入填充字節。

    (3)如何減少填充?

    ????????對于結構體而言,調整成員順序可以優化結構體大小。如下所示:

    //字節大小為24
    struct MyStruct {int a;      // 4 字節,對齊值 4double b;   // 8 字節,對齊值 8char c;     // 1 字節,對齊值 1
    };//字節大小為16
    struct OptimizedStruct {double b;   // 8 字節,對齊值 8int a;      // 4 字節,對齊值 4char c;     // 1 字節,對齊值 1
    };

    14. 結構體和聯合體中成員所占內存大小。?

    (1)內存分配。

    ????????結構體中的每個成員都有自己的內存空間,所有成員的內存是按順序排列的。

    ????????聯合體中的所有成員共享同一塊內存空間。

    (2)內存所占大小。

    ????????結構體的總大小是各個成員大小的總和(可能會有填充字節以保證字節對齊,結構體的對齊方式通常由其最大成員的對齊要求決定。)。

    ????????聯合體無論定義了多少個成員,內存大小總是等于其最大成員的大小。

    舉例:

    #include <iostream>
    //結構體
    struct MyStruct { int a;      // 4 bytesdouble b;   // 8 byteschar c;     // 1 byte
    };struct MyStruct2 { int a;      // 4 byteschar c;     // 1 bytedouble b;   // 8 bytes    
    };//聯合體
    union MyUnion {int a;      // 4 bytesdouble b;   // 8 byteschar c;     // 1 byte
    };int main() {MyStruct  s1 = {1, 3.14, 'A'};MyStruct2 s2 = {1, 3.14, 'A'};MyUnion u={10,2.2,'C'};std::cout << "Size of struct: " << sizeof(s1) << " bytes" << std::endl;  //大小為24字節。std::cout << "Size of struct: " << sizeof(s2) << " bytes" << std::endl;  //大小為16字節。std::cout << "Size of union: " << sizeof(u) << " bytes" << std::endl;   //大小為8字節。return 0;
    }
    

    結構體大小分析:以使得結構體的總大小是 8最大成員所占字節的倍數。

    • int a?占用 4 字節。插入 4 字節填充,使?double b?從 8 字節邊界開始。

    • double b?占用 8 字節。

    • char c?占用 1 字節。插入 7 字節填充,使結構體總大小為 8 的倍數。?

    • 大小:4+4+8+1+7=24。

    15. 數組和鏈表的區別。

    (1)數組的地址空間是連續的,而鏈表的地址空間不是連續的。

    (2)數組大小固定,而鏈表的大小不固定。

    (3)數組的訪問速度更快。數組直接可以使用下標進行訪問,而鏈表則需要遍歷訪問。

    (4)鏈表增刪改查的速度更快。

    (5)數組適用于數據量固定或變化不大,且需要頻繁隨機訪問的場景。鏈表適合需要頻繁插入和刪除,不需要隨機訪問的場景。

    16. define和typedef的區別。?

    (1)#define?是 C/C++ 中的預處理指令,它在編譯之前由預處理器處理,進行簡單的文本替換。適合定義常量、宏或代碼片段,但不安全且難以調試。

    ●特點:不進行類型錯誤檢查,只是簡單的文本替換。可以定義常量、函數宏或代碼片段。

    #define PI 3.14159          // 定義常量
    #define MAX(a, b) ((a) > (b) ? (a) : (b))  // 定義函數宏int main() {double radius = 5.0;double area = PI * radius * radius;  // 替換為 3.14159 * radius * radiusint max_value = MAX(10, 20);         // 替換為 ((10) > (20) ? (10) : (20))return 0;
    }

    (2)typedef?是 C/C++ 中的關鍵字,用于為現有類型定義別名。類型安全且易于調試,適合提高代碼可讀性和維護性。

    ●特點:進行類型檢查,是類型安全的。只能用于定義類型別名,不能定義常量或宏。

    typedef unsigned int uint;  // 定義 uint 為 unsigned int 的別名
    typedef int* IntPtr;        // 定義 IntPtr 為 int* 的別名int main() {uint x = 10;            // 等價于 unsigned int x = 10;IntPtr p = &x;          // 等價于 int* p = &x;return 0;
    }

    ???????如果需要類型安全或定義復雜類型別名,優先使用?typedef;如果需要定義常量或宏函數,可以使用?#define

    17. 程序分為幾個段?

    ?????????通常,程序分為代碼段(text)、數據段(data)、BSS段、堆(heap)和棧。具體詳情查看本文內容第二章節。

    ●代碼段:存儲可執行指令(編譯后的機器碼)。

    ●數據段:通常包括已初始化的全局變量和靜態變量。

    ●BSS段:存放未初始化的全局變量和靜態變量,或者初始化為0的變量。?

    堆:動態分配的內存(如?malloc)。

    ●棧:局部變量。

    18. 棧和隊列的區別?

    (1)核心規則

    ?

    (2)基本操作

    ?(3)結構特點

    (4)示例

    19. c文件是如何轉為可執行文件的?

    具體詳情查看文章:Linux環境下的編譯和調試。

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

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

    相關文章

    go-zero學習筆記(三)

    利用goctl生成rpc服務 編寫proto文件 // 聲明 proto 使用的語法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可選) option go_package "./demo";// 如需為 .proto 文件添加注釋&#xff0c;請使用 C/C 樣式的 // 和 /* ... */…

    Javascript代碼庫-jQuery入門

    摘自千鋒教育kerwin的js教程 jQuery 是一個前端庫&#xff0c;也是一個方法庫他里面封裝著一些列的方法供我們使用我們常用的一些方法它里面都有&#xff0c;我們可以直接拿來使用就行了jQuery 之所以好用&#xff0c;很多人愿意使用&#xff0c;是因為他的幾個優點太強大了 優…

    【25考研】南開軟件考研復試復習重點!

    一、復試內容 復試采取現場復試的方式。復試分為筆試、機試和面試三部分。三部分合計100分&#xff0c;其中筆試成績占30%、機試成績占30%、面試成績占40%。 1.筆試&#xff1a;專業綜合基礎測試 考核方式&#xff1a;閉卷考試&#xff0c;時長為90分鐘。 筆試考查內容范圍…

    【最長上升子序列Ⅱ——樹狀數組,二分+DP,純DP】

    題目 代碼&#xff08;只給出樹狀數組的&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]為尾的LIS的最大長度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…

    012-51單片機CLD1602顯示萬年歷+鬧鐘+農歷+整點報時

    1. 硬件設計 硬件是我自己設計的一個通用的51單片機開發平臺&#xff0c;可以根據需要自行焊接模塊&#xff0c;這是用立創EDA畫的一個雙層PCB板&#xff0c;所以模塊都是插針式&#xff0c;不是表貼的。電路原理圖在文末的鏈接里&#xff0c;PCB圖暫時不選擇開源。 B站上傳的…

    容器迭代器iterator

    文章目錄 1、自定義String實現iterator2、自定義vector實現iterator3、迭代器失效問題 迭代器的功能&#xff1a;提供一種統一的方式&#xff0c;來透明的遍歷容器。 迭代器可以透明的訪問容器內部的元素的值&#xff0c;而無需了解其底層遍歷機制具體是數組的下標還是鏈表的指…

    對象的實例化、內存布局與訪問定位

    一、創建對象的方式 二、創建對象的步驟: 一、判斷對象對應的類是否加載、鏈接、初始化: 虛擬機遇到一條new指令&#xff0c;首先去檢查這個指令的參數能否在Metaspace的常量池中定位到一個類的符號引用&#xff0c;并且檢查這個符號引用代表的類是否已經被加載、解析和初始化…

    傳輸層協議 UDP 與 TCP

    &#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux 目錄 一&#xff1a;&#x1f525; 前置復盤&#x1f98b; 傳輸層&#x1f98b; 再談端口號&#x1f98b; 端口號范圍劃分&#x1f98b; 認識知名端口號 (Well-Know Port Number) 二&#xf…

    實驗十一 Servlet(二)

    實驗十一 Servlet(二) 【實驗目的】 1&#xff0e;了解Servlet運行原理 2&#xff0e;掌握Servlet實現方式 【實驗內容】 改造實驗10&#xff0c;引入數據庫&#xff0c;創建用戶表&#xff0c;包括用戶名和密碼&#xff1a;客戶端通過login.jsp發出登錄請求&#xff0c;請求…

    服務SDK三方新版中央倉庫和私服發布詳解

    預備信息Github倉庫發布Gradle版本匹配Gradle項目構建全局變量定義Gradle項目Nexus倉庫配置與發布過程Gradle項目發布至Sonatype中央倉庫配置過程總結當我們在實現一個項目技術總結、工具類封裝或SDK封裝,通常是為了方便開發者使用特定服務或平臺而提供的一組工具和API。您可能…

    git 新項目

    新項目git 新建的項目如何進行git 配置git git config --global user.name "cc" git config --global user.email ccexample.com配置遠程倉庫路徑 // 添加 git remote add origin http://gogs/cc/mc.git //如果配錯了&#xff0c;刪除 git remote remove origin初…

    openmv的端口被拆分為兩個 導致電腦無法訪問openmv文件系統解決辦法 openmv USB功能改動 openmv驅動被更改如何修復

    我之前誤打誤撞遇到一次&#xff0c;直接把openmv的全部端口刪除卸載然后重新插上就會自動重新裝上一個openmv端口修復成功&#xff0c;大家可以先試試不行再用下面的方法 全部卸載再重新插拔openmv 要解決OpenMV IDE中出現的兩個端口問題&#xff0c;可以嘗試以下步驟&#x…

    利用Python高效處理大規模詞匯數據

    在本篇博客中&#xff0c;我們將探討如何使用Python及其強大的庫來處理和分析大規模的詞匯數據。我們將介紹如何從多個.pkl文件中讀取數據&#xff0c;并應用一系列算法來篩選和擴展一個核心詞匯列表。這個過程涉及到使用Pandas、Polars以及tqdm等庫來實現高效的數據處理。 引…

    LabVIEW雙光子成像系統:自主創新,精準成像,賦能科研

    雙光子成像系統&#xff1a;自主創新&#xff0c;精準成像&#xff0c;賦能科研 第一部分&#xff1a;概述 雙光子成像利用兩個低能量光子同時激發熒光分子&#xff0c;具有深層穿透、高分辨率、低光損傷等優勢。它能實現活體深層組織的成像&#xff0c;支持實時動態觀察&…

    Deepseek-R1 和 OpenAI o1 這樣的推理模型普遍存在“思考不足”的問題

    每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

    Vue3學習筆記-Vue開發前準備-1

    一、安裝15.0或更高版本的Node.js node -v npm -v 二、創建Vue項目 npm init vuelatest 三、Vue項目結構 node_modules: Vue項目運行的依賴文件public&#xff1a;資源文件夾package.json&#xff1a;信息描述文件

    Denavit-Hartenberg DH MDH坐標系

    Denavit-Hartenberg坐標系及其規則詳解 6軸協作機器人的MDH模型詳細圖_6軸mdh-CSDN博客 N軸機械臂的MDH正向建模&#xff0c;及python算法_mdh建模-CSDN博客 運動學3-----正向運動學 | 魚香ROS 機器人學&#xff1a;MDH建模 - 哆啦美 - 博客園 機械臂學習——標準DH法和改進MDH…

    自然語言生成(NLG)算法模型評估方案的硬件配置、系統架構設計、軟件技術棧、實現流程和關鍵代碼

    智能化對話中的自然語言生成&#xff08;NLG&#xff09;算法模型評估是一個復雜而多維的過程&#xff0c;它涉及多個評估指標和策略&#xff0c;以確保生成的文本質量、準確性和流暢性。 智能化對話中的NLG算法模型評估是一個涉及多個評估指標和策略的過程。通過選擇合適的評估…

    排序算法--基數排序

    核心思想是按位排序&#xff08;低位到高位&#xff09;。適用于定長的整數或字符串&#xff0c;如例如&#xff1a;手機號、身份證號排序。按數據的每一位從低位到高位&#xff08;或相反&#xff09;依次排序&#xff0c;每次排序使用穩定的算法&#xff08;如計數排序&#…

    數據結構:時間復雜度

    文章目錄 為什么需要時間復雜度分析&#xff1f;一、大O表示法&#xff1a;復雜度的語言1.1 什么是大O&#xff1f;1.2 常見復雜度速查表 二、實戰分析&#xff1a;解剖C語言代碼2.1 循環結構的三重境界單層循環&#xff1a;線性時間雙重循環&#xff1a;平方時間動態邊界循環&…