某外企筆試總結——純C語言

這里寫自定義目錄標題

  • 一、`sizeof` 計算(32位環境)
  • 二、簡答題
  • 三、數據存儲區域與可修改性
  • 四、字符串比較輸出及原因
  • 五、數組指針運算輸出
  • 六、字符串倒序代碼錯誤排查
  • 七、下面程序可以把1維數組轉為2維數組,然后調用 printArr2D 打印出數組內容,請補全調用 printArr2D部分的代碼(可以增加變量)。(10分)
  • 八、使用C語言實現void memecpy(void* pdest,void* psrc,size_t nsrc)

一、sizeof 計算(32位環境)

在這里插入圖片描述
1.1 sizeof(str)char str[] = "Hello";

  • 字符串 "Hello" 實際存儲為 'H' 'e' 'l' 'l' 'o' '\0',共 6 字節sizeof 計算數組總字節數,結果為 6

1.2 sizeof(p)char *p = str;

  • 32位系統中,指針變量占 4 字節(存儲內存地址),結果為 4

1.3 sizeof(n)long n = 10;

  • 32位系統里,long 類型占 4 字節,結果為 4

1.4 sizeof(str)void foo(char str[100])

  • 數組作為函數參數時,退化為指針,32位下指針占4字節,結果為 4(注:char str[100] 形式僅語法兼容,實際是指針)。

1.5 sizeof(p)void *p = malloc(100);

  • 指針變量 p 存地址,32位下占 4 字節,結果為 4malloc 分配堆內存,但指針本身大小由系統位數決定)。

我的錯誤點:
sizeof(str)char str[] = "Hello";
我的答案:4
我給的原因:字符數組的數組名難道不是指針嗎?指針就是4啊?
豆包給我解答

你的理解存在一個關鍵誤區:數組名本身不是指針,只有在特定上下文中才會“退化”為指針。讓我用最直觀的方式解釋清楚:

①、直接結論
對于 char str[] = "Hello";

  • sizeof(str) 的結果是 6(字符串長度5 + 結尾的 '\0',共6字節)。
  • 數組名 str 不是指針,它代表整個數組的內存區域。

②、為什么容易誤以為數組名是指針?
因為在大多數表達式中,數組名會被隱式轉換為指向首元素的指針(這叫“退化”)。比如:

char* ptr = str;  // 這里 str 退化為指針,等價于 ptr = &str[0];

但注意,這種退化不是無條件的!有兩個例外:

  1. sizeof(數組名):返回數組總大小,而非指針大小。
  2. &數組名:返回數組的地址(類型是 char(*)[N],而非 char*)。

③、用例子驗證
看這段代碼:

#include <stdio.h>int main() {char str[] = "Hello";char* ptr = str;  // str 退化為指針printf("sizeof(str) = %zu\n", sizeof(str));  // 輸出 6printf("sizeof(ptr) = %zu\n", sizeof(ptr));  // 輸出 4/8(指針大小)printf("str 的地址: %p\n", (void*)str);     // 首元素地址printf("&str 的地址: %p\n", (void*)&str);   // 數組的地址(數值上與首元素相同,但類型不同)return 0;
}

輸出結果(32位系統):

sizeof(str) = 6
sizeof(ptr) = 4
str 的地址: 0x7ffd5a0b8d80
&str 的地址: 0x7ffd5a0b8d80
  • 雖然 str&str 的數值相同,但類型不同:
    • strchar[6] 類型(數組)。
    • &strchar(*)[6] 類型(指向數組的指針)。

④、對比:真正的指針
如果直接定義指針:

char* ptr = "Hello";  // 指針指向常量區的字符串

此時:

  • sizeof(ptr) 永遠是 4/8字節(取決于系統是32位還是64位)。
  • 字符串 "Hello" 存儲在常量區,ptr 只是存儲它的地址。

⑤、一句話總結
數組名 ≠ 指針
數組名在內存中直接表示整個數組的內存區域,而指針是一個存儲地址的變量。sizeof 作用于數組名時,返回的是數組實際占用的內存大小,而非指針的大小。

二、簡答題

在這里插入圖片描述

  1. const 的用途(至少兩種)
  • 修飾變量:定義只讀變量,編譯期限制修改(如 const int a = 10;a 不可被賦值改變 )。
  • 修飾函數參數:保護傳入參數,防止函數內意外修改(如 void func(const int x),確保 x 在函數內只讀 )。
  • 修飾函數返回值:限制返回值不可被直接修改(如 const int func(),返回值賦值給普通變量不影響,但賦值給 const 變量可增強約束 )。
  1. C++ 調用 C 編譯函數加 extern "C" 的原因
  • 解決命名沖突:C++ 支持函數重載,編譯會給函數名加額外修飾(如 func(int) 變成 _func_int );C 編譯的函數名無修飾。加 extern "C" 讓 C++ 按 C 規則查找函數名,保證調用匹配。

我的回答:可以讓C語言調用C++的接口不夠完善!
八股文的回答:
在C++中,"extern”關鍵字有兩個主要作用:
①聲明變量的外部鏈接:

? 當一個變量在一個文件中聲明,但在另一個文件中定義時,我們可以使用"extern”關鍵字來告知編譯器該變量在其他地方定義,避免編譯器的編譯錯誤。
②extern"C":

? 在導出C++函數符號時,通過extern"C",可以保證導出的符號為C符號,而不是C++的符號(namemangling),這樣可以更好的做兼容。比如Ilvm編譯器導出的庫,通過C符號可以做到MSVC編譯器也可以正常鏈接使用。

  1. int (*s[10])(int) 表示的含義
  • 這是一個函數指針數組
    • s 是數組,包含 10 個元素;
    • 每個元素是函數指針,指向的函數接收 int 類型參數、返回 int 類型結果。

三、數據存儲區域與可修改性

在這里插入圖片描述

  1. char s[] = "abc";
  • "abc" 存于靜態初始化區域/全局/靜態存儲區(數組 s 是局部變量,但字符串字面量編譯時放靜態區,運行時數組 s 會拷貝字面量內容到棧上,不過嚴格說字面量源頭在靜態區 )。
  1. char *p1 = "123456";
  • "123456\0" 存于常量區(字符串字面量默認放常量區,p1 是指針,存于棧,指向常量區內容 )。
  1. char *p2 = (char*)malloc(20);
  • p2 指向的內存由 malloc 分配,存于堆區
  1. 可修改性判斷
  • s[]:數組 s 在棧上,內容可修改(如 s[0] = 'A'; 合法 )。
  • p1:指向常量區,內容不可修改(p1[0] = 'A'; 會觸發未定義行為,常量區只讀 )。
  • p2:指向堆區,內容可修改(如 p2[0] = 'A'; 合法,堆內存可讀寫 )。

我的錯誤:
char s[] = "abc"; 我的答案:"abc" 存于 “常量區”
豆包回答我的問題:
這里需要區分字符串字面量本身的存儲數組 s 的存儲,可以從編譯、運行階段拆分理解:

①字符串字面量 "abc" 的本質

  1. 編譯時
    字符串字面量 "abc" 是程序的“靜態數據”,編譯器會把它放到只讀數據段(靜態區的一種)。不管你用不用 char s[] = "abc";,只要代碼里寫了 "abc",它就會被存到靜態區,目的是讓多個相同字面量共享內存(比如 char* p = "abc"; 也會指向這里)。

  2. 運行時
    當執行 char s[] = "abc"; 時,程序會把靜態區里的 "abc"(包括末尾 '\0')拷貝一份,放到棧上給數組 s 使用。

    所以,字面量本身的“源頭”在靜態區,但數組 s 是棧上的拷貝,二者是“內容相同、存儲區不同”的關系。

② 為什么說數組 s 不在靜態區?

  • 靜態區的特點:數據編譯時分配,程序結束才釋放,且全局可見(比如全局數組、static 變量)。

  • 數組 s 的特點

    • 它是局部變量(假設在函數內定義),運行時在棧上分配內存,函數結束就釋放。
    • 它的內容是靜態區字面量的“拷貝”,不是字面量本身。

    因此,數組 s 存儲在棧上,而它的“數據源”(字面量 "abc")在靜態區。

③、對比 char* p = "abc"; 加深理解

  • char* p = "abc";
    p 是指針(存在棧/全局區,看定義位置),它直接指向靜態區的 "abc"(沒有拷貝)。此時,靜態區的 "abc" 是只讀的(修改 p[0] 會觸發未定義行為)。

  • char s[] = "abc";
    s 是數組(存在棧上),它拷貝靜態區的 "abc" 到棧,內容可修改(s[0] = 'A'; 合法)。

④、一句話總結
"abc" 作為字符串字面量,源頭在靜態區;但 char s[] = "abc"; 是把字面量“復制”到棧上的數組,所以數組 s 存儲在棧,而非靜態區。核心區別是“直接引用靜態區”還是“拷貝到棧” 。
你的理解基本正確,但需要更精確地區分字符串字面量的存儲區域變量(指針/數組)的存儲區域,以及術語的統一性(“常量區”和“靜態區”在很多場景下是重疊的概念)。下面詳細拆解:

⑤、關于 char* p1 = "123456";

  1. 字符串字面量 "123456" 的存儲
    字符串字面量 "123456" 本質是常量字符串,編譯時會被放入只讀數據段(屬于靜態區/常量區)
    • 它的完整內容是 "123456\0"(編譯器自動添加結束符 '\0'),存儲在靜態區的只讀區域,不可修改(強行修改會觸發未定義行為,比如程序崩潰)。

⑥、關于 char s[] = "abc";

  1. 字符串字面量 "abc" 的存儲
    "123456" 一樣,字符串字面量 "abc" 本身在編譯時也存于靜態區(常量區),完整內容是 "abc\0"

⑦、關鍵術語統一:靜態區 vs 常量區

  • 靜態區:是程序內存布局的一個大分類,包含全局變量、靜態變量、常量字符串字面量等,特點是編譯時分配內存,程序結束后釋放。
  • 常量區(只讀數據段):是靜態區的一部分,專門存儲不可修改的常量(如字符串字面量、const 修飾的全局變量等)。

因此,“字符串字面量存在靜態區”和“存在常量區”并不矛盾——常量區屬于靜態區的子集,字符串字面量是靜態區中只讀的那部分

⑧、總結表格

代碼字符串字面量存儲位置變量(指針/數組)存儲位置能否修改內容?
char* p1 = "123";靜態區(常量區,"123\0"p1 本身在棧/靜態區(看定義)不能(字面量只讀)
char s[] = "abc";靜態區(常量區,"abc\0"s 本身在棧/靜態區(看定義)能(拷貝的內容可改)

簡單說:所有字符串字面量的“源頭”都在靜態區的常量區,但數組會拷貝字面量內容到自己的存儲區(棧或靜態區),而指針直接指向字面量本身。

以下是題目詳細解答,按題目模塊拆分說明:

在這里插入圖片描述

四、字符串比較輸出及原因

代碼:

char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";cout << (str1 == str2) << endl; 
cout << (str3 == str4) << endl; 
cout << (str5 == str6) << endl; 
cout << (str7 == str8) << endl; 

輸出結果

0  
0  
1  
1  

原因

  • str1str2str3str4數組,每個數組獨立分配內存(棧上),即使內容相同,地址不同,== 比較地址,結果為 0(假)。
  • str5str6str7str8指針,指向字符串字面量(存常量區,相同字面量共享地址 ),所以 str5str6str7str8 地址相同,== 結果為 1(真)。

我的答案: 0 0 0 0
我的原因: 不都是在棧區申請了的臨時變量指針嗎?
仔細思考: 指針說白了就是用來存儲地址的,說白了str5 str6 和str7 str8都指向的是同一塊地址,自然而然值相同,對于str1 str2 str3 str4 來說 char str1[] = “abc”; 存在棧區的str1 會把靜態常量區的“abc”拷貝到棧區?

豆包給我的回答:
詳細分析:

  1. str1str2 是數組(棧上獨立內存)
  • char str1[] = "abc";char str2[] = "abc"; 分別在棧上創建兩個獨立的數組。
  • 雖然它們的內容都是 "abc\0",但數組名代表數組首地址,而兩個數組在內存中的位置不同,因此 str1str2 的地址不同。
  • str1 == str2 比較的是地址,結果為 0(假)
  1. str3str4 同理(const 不影響存儲位置)
  • const 僅限制對數組內容的修改,但數組本身仍在棧上分配獨立內存。
  • 因此 str3str4 的地址不同,str3 == str4 結果為 0
  1. str5str6 是指針(指向靜態區的同一字符串)
  • const char *str5 = "abc";str6 都指向靜態區的字符串字面量 "abc\0"
  • 編譯器通常會將相同的字符串字面量合并為一處存儲,因此 str5str6 指向同一塊內存地址。
  • str5 == str6 比較的是指針值(地址),結果為 1(真)
  1. str7str8 同理(即使沒有 const,仍指向靜態區)
  • 雖然 char *str7 = "abc"; 沒有顯式聲明 const,但字符串字面量 "abc\0" 仍存于靜態區且不可修改。
  • str7str8 同樣指向靜態區的同一字符串,因此 str7 == str8 結果為 1

關鍵區別:

  • 數組名(如 str1str2)代表數組首地址,每個數組在內存中獨立分配,地址不同。
  • 指針(如 str5str6)存儲的是字符串字面量的地址,相同的字面量通常共享同一內存位置。

因此,數組比較結果為 0,指針比較結果為 1

五、數組指針運算輸出

在這里插入圖片描述

代碼:

main()
{int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));
}

輸出結果2,5

解析

  • *(a + 1)a 是數組首地址,a + 1 指向 a[1],值為 2
  • &a 是數組指針(類型 int (*)[5]),&a + 1 跳過整個數組(偏移 5 * sizeof(int) 字節 ),ptr 指向數組末尾后第一個位置;ptr - 1 回退到 a[4],值為 5

六、字符串倒序代碼錯誤排查

在這里插入圖片描述

原代碼(功能:字符串倒序):

#include"string.h"
main()
{char* src = "hello,world";char* dest = NULL;int len = strlen(src);dest = (char*)malloc(len); char* d = dest;char* s = src[len]; while(len-- !=0)  d++ = s--; printf("%s", dest); return 0;
}

錯誤及修正

  1. malloc 空間不足

    • 原代碼 malloc(len) 未給字符串結束符 '\0' 留空間,需改為 malloc(len + 1)
  2. src[len] 語法錯誤

    • src 是指針,src[len] 是字符(越界,src 有效下標 0~len-1 ),應改為 src + len - 1(指向最后一個有效字符 )。
  3. 未處理字符串結束符

    • 倒序后需手動在 dest 末尾加 '\0',否則輸出亂碼。
  4. main 函數標準寫法

    • 建議顯式寫 int main(),增強可讀性。

修正后代碼

#include <string.h>
#include <stdio.h>
#include <stdlib.h>int main() {char* src = "hello,world";char* dest = NULL;int len = strlen(src);// 1. 分配足夠空間(含 '\0')dest = (char*)malloc(len + 1); char* d = dest;// 2. 指向最后一個有效字符char* s = src + len - 1; while (len-- != 0) {*d++ = *s--; }// 3. 手動加結束符*d = '\0'; printf("%s", dest); free(dest); // 釋放堆內存(可選,若關注內存泄漏)return 0;
}

最終答案整理
4. 輸出依次:0011(數組地址不同,常量區字符串指針地址相同 )。
5. 輸出:2,5(指針運算定位數組元素 )。
6. 錯誤:malloc 空間不足、src[len] 語法錯、缺結束符、main 不標準;修正后可正確倒序輸出 dlrow,olleh

七、下面程序可以把1維數組轉為2維數組,然后調用 printArr2D 打印出數組內容,請補全調用 printArr2D部分的代碼(可以增加變量)。(10分)

在這里插入圖片描述

要調用 printArr2D,需要構造一個符合 int** 類型的參數。由于 arr2D 是二維數組,在 C 語言中,二維數組名可以轉換為指向指針的指針,但更直接的方式是構造一個指針數組,每個元素指向二維數組的一行。

以下是補全的代碼:

#include <stdio.h>
#define ROW 2
#define COL 3void printArr2D(int** arr2D, int row, int col) {int i, j;for (i = 0; i < row; i++) {for (j = 0; j < col; j++) {printf("%d ", arr2D[i][j]);}printf("\n");}
}int main(int argc, char *argv[]) {int arr1D[] = {1, 2, 3, 4, 5, 6};int arr2D[ROW][COL];int i, j;for (i = 0; i < ROW; i++) {for (j = 0; j < COL; j++) {arr2D[i][j] = arr1D[i * COL + j];}}// 構造一個指針數組,每個元素指向 arr2D 的一行int* rowPtrs[ROW];for (i = 0; i < ROW; i++) {rowPtrs[i] = arr2D[i];}// 調用 printArr2D,傳遞指針數組printArr2D(rowPtrs, ROW, COL);return 0;
}

關鍵步驟說明:

  1. 構造指針數組 rowPtrs
    由于 printArr2D 的參數是 int**(指向指針的指針),而二維數組 arr2D 的行地址可以通過指針數組存儲。
    rowPtrs[i] = arr2D[i]; 讓每個指針元素指向 arr2D 的一行。

  2. 調用 printArr2D
    直接傳遞 rowPtrs(類型為 int**),匹配函數參數要求。

這樣就能正確打印二維數組的內容,輸出:

1 2 3 
4 5 6 

八、使用C語言實現void memecpy(void* pdest,void* psrc,size_t nsrc)

在這里插入圖片描述

實現思路
memcpy 函數用于將一段內存區域的數據復制到另一個區域,需要處理以下關鍵點:

  1. 內存重疊問題:標準 memcpy 不保證處理重疊內存(需用 memmove),但題目要求實現 memcpy,因此忽略重疊。
  2. 字節級復制:使用 char* 指針逐字節復制,確保處理任意數據類型。
  3. 參數合法性檢查:檢查輸入指針是否為 NULL,提高函數健壯性。

代碼實現

#include <stddef.h>  // 包含 size_t 定義void* memcpy(void* pdest, const void* psrc, size_t nsrc) {// 1. 檢查參數合法性(標準庫通常不檢查,此處為增強健壯性)if (pdest == NULL || psrc == NULL) {return NULL;}// 2. 轉換為 char* 以逐字節操作char* dest = (char*)pdest;const char* src = (const char*)psrc;// 3. 逐字節復制 nsrc 字節for (size_t i = 0; i < nsrc; i++) {dest[i] = src[i];}// 4. 返回目標指針return pdest;
}

關鍵說明

  1. 指針類型轉換

    • void* 轉換為 char* 以逐字節復制,確保正確處理任意數據類型。
    • src 被聲明為 const char*,防止修改源數據。
  2. 內存重疊處理

    • 若源區域與目標區域重疊,結果未定義(如 srcdest 前且部分重疊,可能覆蓋未復制的數據)。
    • 若需處理重疊,應使用 memmove(通過逆向復制避免覆蓋)。
  3. 返回值

    • 返回 pdest 以便鏈式調用(如 strcpy(dest, memcpy(dest, src, n)))。
  4. 性能優化

    • 實際標準庫實現可能使用更高效的方式(如按字長復制或 SIMD 指令),但此處采用簡潔的逐字節復制以保證通用性。

此實現符合標準 memcpy 的行為,適用于非重疊內存的復制場景。

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

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

相關文章

Qt Graphs 模塊擬取代 charts 和 data visualization還有很長的路要走

近期關注 Qt 6.10 的分支進展&#xff0c; 發現了 Qt 6.10 的 charts 和 data visualization &#xff08;以下簡稱 DV&#xff09;已經被deprecated, 功能將會合并到 graphs 模塊。如果后面 charts\ DV 被棄用&#xff0c;那算是很大的API變化了。從Qt 6.5 以后開始引入的 gra…

2025牛客暑期多校訓練營2(部分補題)

題目鏈接&#xff1a;牛客競賽_ACM/NOI/CSP/CCPC/ICPC算法編程高難度練習賽_牛客競賽OJ B Bitwise Perfect 思路 考慮到由&#xff0c;那么只有變小的時候對答案的貢獻才能夠減少&#xff0c;從二進制的角度考慮什么時候變小&#xff0c;只有min(x,y)中的最高位1異或之后變…

Nginx的location匹配規則

Nginx的location匹配規則 為什么你的Nginx配置總是不生效&#xff1f; 改了Nginx配置無數次&#xff0c;reload命令執行了幾十遍&#xff0c;瀏覽器訪問時卻依然返回404&#xff1f;運維工程師小張上周就遇到了這個問題&#xff1a;明明配置了location /static/ { root /var/ww…

USB 2.0 vs USB 3.0:全面技術對比與選擇指南

USB 2.0 vs USB 3.0&#xff1a;全面技術對比與選擇指南 引言 在當今數字時代&#xff0c;USB接口已成為連接設備與計算機的最普遍標準之一。從2000年USB 2.0的發布到2008年USB 3.0的問世&#xff0c;USB技術經歷了顯著的演進。本文將深入比較這兩種廣泛使用的USB標準&#xff…

DApp架構設計與開發流程指南

目錄 DApp架構設計與開發流程指南 引言:DApp的核心特性 一、DApp架構設計 1.1 分層架構設計 各層核心組件: 1.2 典型架構模式 1.2.1 全去中心化架構 1.2.2 混合架構(推薦) 二、開發流程 2.1 敏捷開發流程 2.2 詳細開發階段 階段1:需求分析與設計(1-2周) 階段2:智能合約…

Windows下odbc配置連接SQL Server

一、查看SQL Server服務是否啟動打開SQL Server 2022配置管理器查看SQL Server運行狀態&#xff0c;可以設置 啟動或停止服務二、windows下如何配置ODBC數據源1、Windows搜索欄中輸入“ODBC數據源管理器”并選擇“以管理員身份運行”來打開它2、添加新的數據源ODBC數據源管理器…

MySQL—表設計和聚合函數以及正則表達式

文章目錄一、第一范式&#xff08;原子性&#xff09;二、第二范式&#xff08;消除部分依賴&#xff09;三、第三范式&#xff08;消除傳遞依賴&#xff09;四、表設計五、聚合函數六、正則表達式MySQL 的三大范式&#xff08;1NF、2NF、3NF&#xff09;是關系型數據庫設計的核…

基于Electron打包jar成Windows應用程序

基于Electron打包jar成Windows應用程序簡介注意編譯及命令&#xff1a;運行效果登錄界面用戶管理界面界面全屏鎖屏界面文檔查看界面簡介 本文介紹了一種將maven jar包打包成Windows下EXE可執行程序的方法。 Maven打包Java Web應用成jar&#xff0c;Electron封裝jar成Windows …

Autosar RTE實現觀測量生成-基于ETAS軟件

文章目錄前言觀測量定義arTypedPerInstanceMemoryPorts Measurable工具鏈配置及使用Port中的配置arTypedPerInstanceMemory觀測量生成文件分析總結前言 之前我們在XCP中&#xff0c;對于標定量和觀測量并沒有嚴格按照Autosar標準中定義&#xff0c;Autosar RTE中對標定量和觀測…

【REACT18.x】creat-react-app在添加eslint時報錯Environment key “jest/globals“ is unknown

今天在創建新項目的時候&#xff0c;給cra創建的項目添加eslint支持&#xff0c;出現如下報錯 添加eslint npx eslint --init頁面報錯 Compiled with problems:ERROR [eslint] package.json eslint-config-react-app/jest#overrides[0]:Environment key "jest/globals&…

Linux的例行性工作 -- (練習)

1、atd和crond兩個任務管理程序的區別 答&#xff1a; atd 專為一次性任務設計&#xff0c;允許用戶在特定未來時間點&#xff08;絕對或相對時間&#xff09;執行單次命令后就結束。 crond 則是周期性任務的調度核心&#xff0c;通過配置文件&#xff08;crontab&#xff09;實…

《Java語言程序設計》1.6 復習題

1.6.1 什么是Java語言規范?計算機有嚴格的使用規則。如果編寫程序時沒有遵循這些規則&#xff0c;計算機就不能理解程序。Java語言規范和Java API定義了Java的標準。Java語言規范(Java language specification)是對Java程序設計語言的語法和語義的技術定義。應用程序接口(Appl…

【機器學習深度學習】什么是量化?

目錄 前言 一、量化的基本概念 1.1 量化對比示例 1.2 量化是如何實現的&#xff1f; 二、為什么要進行量化&#xff1f; 2.1 解決模型體積過大問題 2.2 降低對算力的依賴 2.3 加速模型訓練和推理 2.4 優化訓練過程 2.5 降低部署成本 小結&#xff1a;量化的應用場…

告別 T+1!解密金融級實時數據平臺的構建與實踐

在數字金融浪潮下&#xff0c;數據處理的“實時性”已不再是加分項&#xff0c;而是逐漸成為決定業務價值的核心競爭力。然而&#xff0c;金融機構在追求實時的道路上&#xff0c;往往陷入一個新的困境&#xff1a;實時分析系統與離線大數據平臺形成了兩套獨立的“煙囪”&#…

[Python] -項目實戰7- 用Python和Tkinter做一個圖形界面小游戲

一、為什么從小游戲入門GUI? 趣味性強:小游戲直觀、有趣,一學就上手。 系統掌握事件驅動:了解按鈕點擊、鍵盤響應、圖形刷新機制。 扎實基礎:為日后構建更復雜應用奠定 GUI 編程基礎。 二、選定游戲:猜數字小游戲 ?? 這個小游戲界面簡單,核心機制是:3 個按鈕分別…

【18】MFC入門到精通——MFC(VS2019)+ OpenCV 顯示圖片的3種方法

MFC (VS2019)+ OpenCV,顯示圖片的3種方法 1 方法介紹 2 方法一:嵌套OpenCV窗口顯示圖片 2.1 建立供工程 添加控件 2.2 引用頭文件 2.3 找到OnInitDialog()函數,在其中添加如下代碼 2.4 在button觸發函數中加入代碼(就是你雙擊button進入的函數) 2.5 注意事項 3 方法二:…

以“融合進化 智領未來”之名,金倉Kingbase FlySync:國產數據庫技術的突破與創新

目錄開篇&#xff1a;國產數據庫的歷史性跨越一、KFS 產品定位及發展歷程回顧1.1 Kingbase FlySync 發展1.2 Kingbase FlySync與Oracle GoldenGate的對比分析1.2.1 Kingbase FlySync 功能優勢1.2.2 技術架構對比1.2.3 性能與擴展性二、數字化時代的新挑戰2.1 決策實時性要求越來…

服務器配置錯誤漏洞

文章目錄一、文件解析漏洞1.Apache HTTPD多后綴解析漏洞二、目錄遍歷漏洞1.Apache目錄遍歷漏洞2.Nginx目錄穿越漏洞服務器配置錯誤漏洞指因服務器&#xff08;含系統、Web服務、數據庫等&#xff09;的參數設置、權限分配、組件配置等不當&#xff0c;導致的安全問題&#xff0…

大模型預測輸尿管上段結石技術方案大綱

目錄 1. 術前階段 2. 術中階段 3. 術后階段 4. 并發癥風險預測 5. 根據預測定手術方案 6. 麻醉方案 7. 術后護理 8. 統計分析 9. 技術驗證方法 10. 實驗證據 11. 健康教育與指導 12. 完整術方案流程圖(Mermaid) 1. 術前階段 步驟 關鍵要素 可編輯字段 1.1 影像采集 CT-IVU / …

docker compose 編排容器 mysql Springboot應用

寫一個docker-compose.yml文件 內容如下&#xff1a; services:db:image: "docker.xuanyuan.me/library/mysql:8.3.0"restart: unless-stoppedhostname: dbports:- "3306:3306"container_name: mysqlenvironment:- "MYSQL_ROOT_PASSWORD1234"m…