47 C 語言指針與數組核心詳解:字符指針 VS 字符數組、數組操作、字符串處理、編程實戰案例

1 字符指針

1.1 概述

????????字符指針變量(簡稱字符指針)是 C 語言中的一種指針類型,用于指向字符或字符串(字符數組、字符串字面量)。字符指針通常用于處理字符串(字符數組),可以方便地進行字符串的讀取、修改和傳遞。

1.2 定義格式

????????字符指針的定義方式與其它類型的指針類似,只是類型指定為 char

char *charPtr;  // charPtr 是一個指向 char 類型的指針。

1.3 指向字符變量

????????字符指針 char * 可以指向一個 char 類型的變量,并通過解引用操作符 * 來訪問修改該變量的值

#include <stdio.h>int main()
{// 定義一個字符變量char ch = 'A';// 定義一個字符指針,并讓它指向字符變量char *ptr = &ch;// 第一次輸出:初始值和地址printf("Character: %c, Address: %p\n", *ptr, (void *)ptr);// 通過解引用指針修改字符變量的值*ptr = 'B'; // 只是修改內容,沒有改變指針的指向printf("Modified character: %c, Address: %p\n", *ptr, (void *)ptr); // 地址不變// 定義一個新的字符變量char newChar = 'C';// 修改指針的指向ptr = &newChar;// 輸出新指向的字符及其地址printf("New character: %c, Address: %p\n", *ptr, (void *)ptr); // 地址改變return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

提示:

????????指針是一個變量,它保存的是地址;可以通過指針修改它指向的數據內容,但并不會改變指針本身的地址;只有當讓指針指向另一個變量時,它的值(地址)才會改變。?

1.4 指向字符數組

????????字符指針不僅可以指向單個字符,也可以指向整個字符串(字符數組),并且可以通過標準庫函數如 strlen() 對其進行操作。只要指針指向的是以 '\0' 結尾的有效字符串,它就可以當作字符串來使用

#include <stdio.h>
#include <string.h>int main()
{// 定義字符數組char str[] = "Hello, World!";// 定義字符指針并保存原始位置char *ptr = str;char *originalPtr = ptr; // 保存原始位置// 使用指針遍歷字符串并逐個打印字符printf("字符串內容: ");while (*ptr != '\0'){printf("%c", *ptr);ptr++; // 最后指針會指向 '\0'}printf("\n");// 輸出長度信息printf("字符數組 str 的長度(不包括 '\\0'): %zu\n", strlen(str));printf("字符指針 originalPtr 所指向字符串的長度: %zu\n", strlen(originalPtr));return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

1.5 指向字符串字面量

????????字符串字面量(如 "Hello, World!")在 C 語言中是存儲在只讀內存段的常量字符串

????????直接使用字符指針指向這些字符串是合法的,但嘗試修改其內容會導致未定義行為

????????因此,建議在聲明字符指針時使用 const 關鍵字修飾,以明確表示所指向的內容不可修改。

#include <stdio.h>
#include <string.h>int main()
{// 使用字符數組定義字符串char arrayStr[] = "Hello, Array!";// 使用字符指針定義字符串(指向字符串字面量)// 注意:字符串字面量是只讀的,不能修改const char *pointerStr = "Hello, Pointer!";// 輸出原始字符串printf("字符數組定義的字符串: %s\n", arrayStr);     // Hello, Array!printf("字符指針定義的字符串: %s\n\n", pointerStr); // Hello, Pointer!// 修改字符數組中的內容printf("1. 單個字符修改很麻煩,需要注意字符串的結束符\n");arrayStr[7] = '1';arrayStr[8] = '2';arrayStr[9] = '3';printf("沒添加結束符的情況:%s\n", arrayStr); // Hello, 123ay!arrayStr[10] = '\0';printf("添加字符串結束符后:%s\n\n", arrayStr); // Hello, 123// 使用 strcpy 函數修改字符串printf("2. 使用 strcpy 函數修改字符串,注意字符數組的長度\n");strcpy(arrayStr, "new Array!");printf("使用 strcpy 函數修改后的字符數組: %s\n", arrayStr); // new Array!// 嘗試修改字符指針指向的字符串(不推薦,會導致未定義行為)// 下面這行代碼會被注釋掉,以避免編譯器警告或運行時錯誤// pointerStr[0] = 'M'; // 這行代碼會導致未定義行為printf("\n嘗試修改字符指針指向的字符串(不推薦,會導致未定義行為)\n");// 重新賦值字符指針,使其指向新的字符串常量pointerStr = "new Pointer!";printf("重新賦值(指向其他字符串常量)后的字符指針: %s\n", pointerStr); // new Pointer!// 分別計算字符數組和字符指針所指向字符串的長度printf("\n--- 長度計算 ---\n");printf("字符數組 arrayStr 的字符串長度(不包括 '\\0'): %zu\n", strlen(arrayStr));printf("字符指針 pointerStr 所指向字符串的長度(不包括 '\\0'): %zu\n", strlen(pointerStr));return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

1.6 字符數組 VS 字符指針

字符數組的操作限制

????????在 C 語言中,字符數組名是一個指向數組首元素的常量指針(constant pointer),這意味著:

  1. 初始化限制:
    • 只能在定義時初始化為一個字符串字面量或另一個字符數組的內容
    • 例如:char str[] = "Hello"; 或 char str[6] = {'H','e','l','l','o','\0'}; 或使用 strcpy 等函數初始化。
  2. 不可重新賦值:
    • 不能被重新賦值以指向新的內存地址
    • 錯誤示例:char str[10]; str = "New String";(會編譯報錯)。
    • 正確做法:只能通過逐個元素重新賦值使用 strcpy 等函數來修改內容。
#include <stdio.h>
#include <string.h>int main()
{// 定義并初始化字符數組char arrayStr[] = "Hello, Array!";printf("初始字符數組內容: %s\n", arrayStr);// 嘗試將字符數組名指向新的字符串(會報錯)// arrayStr = "New String!"; // 編譯錯誤:數組名是常量指針,不能重新賦值// 使用 strcpy 修改字符數組內容//注意:目標數組必須足夠大,以容納源字符串strcpy(arrayStr, "new Array!");printf("使用 strcpy 修改后的內容: %s\n", arrayStr);// 逐個字符修改字符數組內容arrayStr[0] = 'N';arrayStr[1] = 'e';arrayStr[2] = 'w';arrayStr[3] = '_';arrayStr[4] = 'A';arrayStr[5] = 'r';arrayStr[6] = 'r';arrayStr[7] = 'a';arrayStr[8] = 'y';arrayStr[9] = '\0'; // 手動添加字符串結束符printf("逐個字符修改后的內容: %s\n", arrayStr);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

字符指針的靈活性

????????字符指針與字符數組名的一個關鍵區別在于其靈活性:字符指針是一個可變的指針,可以重新賦值以指向不同的字符串或內存位置

  1. 可重新賦值:
    • 字符指針可以在程序運行時指向不同的內存地址
    • 示例:char *ptr = "Hello"; ptr = "World";(合法)
  2. 動態性:
    • 可以指向字符串字面量、字符數組或動態分配的內存
    • 允許在運行時改變指向的內容
    • 不能通過指針修改字符串字面量的內容
#include <stdio.h>int main()
{// 1. 指向字符串字面量const char *ptr = "Hello, World!";printf("初始指向: %s\n", ptr);// 2. 重新賦值,指向另一個字符串字面量ptr = "This is a new string.";printf("重新賦值后指向: %s\n", ptr);// 3. 指向字符數組char arrayStr[] = "Character Array";ptr = arrayStr;printf("現在指向字符數組: %s\n", ptr);// 4. 修改字符數組內容(注意:不是修改指針本身)arrayStr[0] = 'L';printf("修改字符數組后的內容: %s\n", ptr); // 指針內容同步更新return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

修改方式的區別

????????在C語言中,字符數組和字符指針雖然都可以用于處理字符串,但它們在修改方式上有本質區別:

特性字符數組字符指針
地址變化固定不變可以改變
修改內容修改數組內容,不改變數組地址改變指針值使其指向不同地址
內存分配通常為棧內存或靜態存儲區可以指向棧、靜態存儲區或堆內存
靈活性較低較高
  1. 字符數組:
    • 數組名是常量指針,初始化后地址固定
    • 只能修改數組內容,不能改變數組本身的地址
    • 示例:char str[10] = "Hello"; 后,str 始終指向同一內存位置。
  2. 字符指針:
    • 是一個變量,可以重新賦值指向不同地址
    • 可以指向字符串字面量、其他數組或動態分配的內存
    • 示例:char *ptr = "Hello"; ptr = "World"; 合法
#include <stdio.h>
#include <string.h>int main()
{// 定義字符數組和字符指針char arrayStr[] = "Hello, I am Init Array!";char *ptrStr = "Hello, Pointer!";// 輸出初始地址和內容printf("【初始狀態】\n");printf("字符數組 arrayStr 的地址: %p, 內容: %s\n", (void *)arrayStr, arrayStr);printf("字符指針 ptrStr 的地址: %p, 內容: %s\n\n", (void *)&ptrStr, ptrStr);// 修改字符數組內容(不改變地址)strcpy(arrayStr, "Modified Array");printf("【修改字符數組內容后】\n");printf("字符數組 arrayStr 的地址: %p, 內容: %s\n", (void *)arrayStr, arrayStr);printf("字符指針 ptrStr 的地址: %p, 內容: %s\n\n", (void *)&ptrStr, ptrStr);// 修改字符指針的指向(改變地址)ptrStr = "New Pointer String";printf("【修改字符指針的指向后】\n");printf("字符數組 arrayStr 的地址: %p, 內容: %s\n", (void *)arrayStr, arrayStr);printf("字符指針 ptrStr 的地址: %p, 內容: %s\n", (void *)&ptrStr, ptrStr);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

對比總結表

特性/行為字符數組 (Character Array)字符指針 (Character Pointer)
定義方式char array[] = "Hello"; 或
char array[10];
char *ptr = "Hello"; 或
const char *ptr = "Hello";(推薦)
內存分配在棧上或靜態存儲區分配空間(可寫)指向字符串字面量(只讀)、字符數組(可寫)或堆內存(需手動管理)
地址特性數組名是常量指針,指向固定不變指針變量本身是變量,可以改變其指向的地址
初始化只能在定義時用字符串字面量或字符列表或 strcpy 等函數初始化可在定義時賦值,也可后續重新賦值
內容修改? 可以修改數組中的字符(如 array[i] = 'a')? 如果指向的是字符數組或動態內存,可以修改內容;? 不可修改字符串字面量的內容
重新賦值? 不允許(如 array = "new"; 是非法操作)? 允許(如 ptr = "new"; 是合法操作)
字符串字面量指向? 可以初始化為字符串字面量? 可以指向字符串字面量
是否可變內容? 可變(因為數據在棧上或靜態區,且是副本)

? 如果指向字符串字面量不可變;

? 如果指向字符數組或堆內存則可變

動態內存支持? 不支持(大小固定)? 支持,可通過 malloc / calloc 分配,并配合 realloc 動態擴展
靈活性? 固定大小和地址? 更靈活,可隨時改變指向和大小
安全性?? 易發生緩沖區溢出(如使用 strcpy 時未檢查長度)?? 需注意懸空指針、野指針、內存泄漏等
典型用途存儲需要頻繁修改的局部字符串字符串訪問、函數傳參、動態字符串處理等
內存釋放? 不需要(棧內存自動釋放)? 需要(當指向堆內存時,應調用 free())
字符串結束符?\0?的處理初始化時自動添加,手動修改時需注意維護同樣需要保證以 \0 結尾才能作為字符串使用

2 編程練習

2.1?指針遍歷數組

????????編寫程序,定義一個整型數組,并通過以下四種方式訪問并打印數組中的每個元素:

  1. 通過數組名和下標訪問:arr[i]
  2. 通過指針和下標訪問:ptr[i]
  3. 通過數組名加偏移量訪問:*(arr + i)
  4. 通過指針加偏移量訪問:*(ptr + i)
#include <stdio.h>int main()
{// 定義一個整型數組并初始化int arr[] = {10, 20, 30};// 計算數組元素個數int size = sizeof(arr) / sizeof(arr[0]);// 定義指針指向數組首元素int *ptr = arr;// 使用四種方式訪問數組元素并輸出printf("數組元素為:\n");for (int i = 0; i < size; i++){printf("通過數組名下標訪問: arr[%d] = %d\n", i, arr[i]);printf("通過指針下標訪問:   ptr[%d] = %d\n", i, ptr[i]);printf("通過數組名偏移訪問: *(arr + %d) = %d\n", i, *(arr + i));printf("通過指針偏移訪問:   *(ptr + %d) = %d\n", i, *(ptr + i));printf("\n");}return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.2?指針與數組求和

????????編寫一個程序,定義一個整型數組,并使用指針以四種不同方式計算數組中所有元素的總和,并輸出每種方式的結果。

  • 使用數組下標訪問:arr[i]
  • 使用指針下標訪問:ptr[i]
  • 使用數組名加偏移訪問:*(arr + i)
  • 使用指針加偏移訪問:*(ptr + i)
#include <stdio.h>int main()
{// 定義整型數組并初始化int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]); // 計算數組長度// 用于存儲四種方式計算出的總和int sum[] = {0, 0, 0, 0};int *ptr = arr; // 指針指向數組首元素// 使用指針遍歷數組,并用四種方法分別求和for (int i = 0; i < size; i++){// 方法一:使用數組名 + 下標訪問sum[0] += arr[i];// 方法二:使用指針 + 下標訪問sum[1] += ptr[i];// 方法三:使用數組名 + 偏移訪問sum[2] += *(arr + i);// 方法四:使用指針 + 偏移訪問sum[3] += *(ptr + i);}// 輸出每種方法計算出的數組元素總和printf("數組元素的和為:\n");printf("  方法一(arr[i]):       %d\n", sum[0]);printf("  方法二(ptr[i]):       %d\n", sum[1]);printf("  方法三(*(arr + i)):   %d\n", sum[2]);printf("  方法四(*(ptr + i)):   %d\n", sum[3]);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.3?指針與數組的最大值

????????編寫程序,定義一個整型數組,并通過指針訪問數組元素的方式,查找該數組中的最大值。

#include <stdio.h>int main()
{int arr[] = {3, 7, 2, 9, 1};int size = sizeof(arr) / sizeof(arr[0]);int max = arr[0]; // 假設第一個元素是最大值int *ptr = arr;   // 指針指向數組的第一個元素// 使用指針查找數組中的最大值for (int i = 1; i < size; i++){// 1. 使用數組下標訪問數組元素并比較// if (arr[i] > max)// {//     max = arr[i];// }// 2. 使用指針訪問數組元素并比較if (*(ptr + i) > max){max = *(ptr + i);}}printf("數組中的最大值: %d\n", max);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.4 指針與字符串反轉

????????編寫程序,定義一個字符串,并使用兩個字符指針分別指向字符串的開頭和結尾,逐個交換字符,最終實現字符串的反轉。

#include <stdio.h>
#include <string.h>int main()
{// 定義一個字符數組并初始化為待反轉的字符串char str[] = "Hello, World!";// 獲取字符串長度int length = strlen(str);// 定義兩個指針:分別指向字符串的開頭和末尾char *start = str;            // 指向字符串首字符char *end = str + length - 1; // 指向字符串最后一個有效字符// 使用指針對字符串進行原地反轉while (start < end){// 交換當前 start 和 end 所指向的字符char temp = *start;*start = *end;*end = temp;// 移動指針:start 向后,end 向前start++;end--;}// 輸出反轉后的字符串printf("反轉后的字符串: %s\n", str);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.5?統計多個字符串長度

????????定義一個指針數組,其元素指向多個字符串字面量。使用循環遍歷該指針數組,統計并打印每個字符串的長度。要求不使用 strlen(),而是用指針手動遍歷直到 '\0'。

#include <stdio.h>int main()
{char *words[] = {"apple", "banana", "cherry", "date"};int size = sizeof(words) / sizeof(words[0]);for (int i = 0; i < size; i++){int length = 0;       // 每一個單詞的長度char *ptr = words[i]; // 指向每一個單詞的指針// 計算單詞的長度// *ptr 指向當前字符,當 *ptr 不為 '\0' 時,繼續循環while (*ptr != '\0'){length++;ptr++;}printf("%s -> %d\n", words[i], length);}return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.6?查找最長的字符串

????????給定一個指針數組,保存多個字符串地址。編寫程序找出其中最長的字符串,并打印它的內容和長度。

#include <stdio.h>
#include <string.h>int main()
{char *names[] = {"Tom", "Jerry", "Alice", "Bob"};int size = sizeof(names) / sizeof(names[0]);char *longest = names[0]; // 假設第一個字符串是最長的for (int i = 1; i < size; i++){// 比較當前字符串和最長字符串的長度if (strlen(names[i]) > strlen(longest)){longest = names[i];}}printf("最長的字符串是:%s(長度為%d)\n", longest, (int)strlen(longest));return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.7 交換二維數組的兩行

????????定義一個 3x4 的二維數組,并使用數組指針交換其中任意兩行的數據。例如交換第 0 行和第 2 行。要求通過指針操作完成,不要逐個交換元素。

#include <stdio.h>int main()
{int matrix[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};// 定義一個指向一行(4 個整數)的指針int (*rowPtr)[4] = matrix; // rowPtr 指向 matrix 的第 0 行// 打印原始矩陣printf("原始矩陣:\n");for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%d ", rowPtr[i][j]);}printf("\n");}// 交換第 0 行和第 2 行int tempRow[4]; // 臨時數組,用于保存第 0 行for (int j = 0; j < 4; j++){tempRow[j] = rowPtr[0][j];   // 保存第 0 行rowPtr[0][j] = rowPtr[2][j]; // 第 2 行賦給第 0 行rowPtr[2][j] = tempRow[j];   // 原第 0 行賦給第 2 行}// 打印交換后的矩陣printf("\n交換第0行和第2行后的矩陣:\n");for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%d ", rowPtr[i][j]);}printf("\n");}return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

2.8?字符串字符類型統計(指針版)

????????編寫一個 C 程序,定義一個字符數組并初始化為一個字符串(如 "Hello World! 123"),然后使用字符指針遍歷該字符串,并分別統計其中的:

  • 字母個數(A-Z, a-z)
  • 數字個數(0-9)
  • 其他字符個數(空格、標點等)
  • 最后輸出各類字符的數量。

????????要求:只能通過字符指針訪問字符串內容,不能直接使用數組下標 [] 來訪問字符。

#include <stdio.h>
#include <ctype.h> // 提供 isalpha() 和 isdigit()int main()
{// 定義并初始化字符數組char str[] = "Hello World! 123";// 定義字符指針,指向字符串首地址char *ptr = str;// 初始化計數器int letterCount = 0; // 字母計數int digitCount = 0;  // 數字計數int otherCount = 0;  // 其他字符計數// 使用字符指針遍歷字符串while (*ptr != '\0'){if (isalpha(*ptr)){letterCount++; // 如果是字母,字母計數加一}else if (isdigit(*ptr)){digitCount++; // 如果是數字,數字計數加一}else{otherCount++; // 其他字符(如空格、標點)}ptr++; // 移動指針到下一個字符}// 輸出結果printf("原始字符串: %s\n\n", str);printf("字母個數: %d\n", letterCount);printf("數字個數: %d\n", digitCount);printf("其他字符個數: %d\n", otherCount);return 0;
}

????????程序在 VS Code 中的運行結果如下所示:

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

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

相關文章

gird 網格布局學習

屬性 1、grid-template-columns 用來定義 網格容器的列軌道&#xff08;columns&#xff09; 的尺寸和數量。它允許你設定網格的列布局&#xff0c;控制列的寬度和排列方式。 // 使用示例 // 你可以使用固定的長度單位來定義每一列的寬度。例如 1、grid-template-columns: 100…

git最常用命令

本地身份 git config --global user.name "酒劍仙" git config --global user.email "xxxxqq.com"創建.gitignore文件 git init鏈接服務器 git remote add origin https://gitee.com/greentran/你的項目.git提交本地 git add .查看本地提交 git statu…

值類:Kotlin中的零成本抽象

Kotlin的值類&#xff08;Value Class&#xff09;是一種強大的類型安全工具&#xff0c;允許開發者創建語義明確的類型&#xff0c;并保持運行時零成本。 假設系統中存在用戶的概念&#xff0c;用戶擁有名字和電子郵箱地址。用戶名和電子郵箱地址都是長度不超過120個字符的字…

arm64版BC-liunx-for-euler與X86_64版OpenEuler從源碼安裝git-lfs

1.arm64版BC-liunx-for-euler安裝git-lfs 檢查系統版本信息 uname -a Linux bms-42068966-004 5.10.0-136.49.0.127.10.oe2203.bclinux.aarch64 #1 SMP Tue Oct 10 14:09:09 CST 2023 aarch64 aarch64 aarch64 GNU/Linux 下載git-lfs構建腳本和源碼 git clone https://gite…

2025國家衛健委減肥食譜PDF完整版(免費下載打印)

《成人肥胖食養指南&#xff08;2024年版&#xff09;》發布&#xff1a;科學減肥&#xff0c;從這里開始? 在這個追求健康與美的時代&#xff0c;減肥成為了許多人關注的熱點話題。國家衛健委正式發布了《成人肥胖食養指南&#xff08;2024年版&#xff09;》&#xff0c;為我…

Android 手機如何實現本地視頻音頻提取?實戰教程來了

我們經常會遇到這樣的需求&#xff1a;比如看到一段喜歡的短視頻&#xff0c;想把里面的背景音樂保存下來&#xff1b;或者需要從一段課程視頻中提取語音內容用于學習。這時候&#xff0c;將手機視頻轉換成 MP3 音頻就是一個非常實用的功能。 今天就來教大家如何使用一款簡單好…

STM32項目---汽車氛圍燈

一、藍牙模塊驅動 1、怎么使用藍牙模塊呢&#xff1f; 1&#xff1a;首先&#xff0c;先通過串口調試助手驗證藍牙模塊是否正常使用。先連接好 2&#xff1a;打開串口調試軟件配置好 3&#xff1a;發送測試指令&#xff1a;AT\r\n,返回OK&#xff0c;則說明連接正確&#xff…

python+uniapp微信小程序的共享雨傘租賃系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

一次生產故障引發的JVM垃圾回收器選型思考:徹底掌握垃圾回收原理及通用配置!

寫在前面的話 前幾天凌晨2點&#xff0c;我被一通電話驚醒——線上交易系統出現了嚴重的延遲問題&#xff0c;用戶支付請求響應時間從平時的100ms飆升到了5秒&#xff0c;客服電話都被打爆了。 經過緊急排查&#xff0c;我們發現罪魁禍首竟然是JVM的垃圾回收器&#xff01;當…

學習日記-day30-6.15

完成目標&#xff1a; 知識點&#xff1a; 1.DDL和DML的補充 知識點 核心內容 重點 快速創建表 使用CREATE TABLE...AS SELECT語句基于現有表快速創建新表 結構和數據復制 vs 僅復制結構&#xff08;WHERE 12&#xff09; 數據刪除操作 DELETE FROM逐條刪除 vs TRUNCAT…

從檢測到智能質控:IACheck如何成為TIC機構的AI中臺?

一、TIC行業為何亟需AI質控&#xff1f; 過去十年&#xff0c;中國的TIC&#xff08;Testing, Inspection, Certification&#xff09;行業年均增長超過10%。無論是消費品、環境監測&#xff0c;還是工業制造、出口貿易&#xff0c;對“第三方檢測報告”的依賴程度持續加深。 …

cka-1.32考題

1、HPA自動擴縮容 考題 &#xff08;考試的考題內容&#xff0c;只有下面方框里的內容&#xff09; 你必須連接到正確的主機。不這樣做可能導致零分。 [candidatebase] $ ssh cka000050 Task 在 autoscale namespace 中創建一個名為 apache-server 的新 HorizontalPodAut…

DeepSeek 技術原理詳解

引言 DeepSeek是一種基于Transformer架構的大型語言模型&#xff0c;它在自然語言處理領域展現出了卓越的性能。本文將深入探討DeepSeek的技術原理&#xff0c;包括其架構設計、訓練方法和優化策略&#xff0c;并結合代碼實現進行詳細講解。 Transformer基礎架構 DeepSeek基…

組件化 websocket

實時數據響應&#xff0c;組件化websocket減少代碼冗余 組件定義 websocket.vue <template><div></div> </template><script>export default {data() {return {webSocket: null, // webSocket實例lockReconnect: false, // 重連鎖&#xff0c;…

IBMS集成系統3D可視化數字孿生管理平臺介紹、搭建、運維

IBMS集成系統3D可視化數字孿生管理平臺介紹、搭建、運維 IBMS集成系統3D可視化數字孿生管理平臺是一種先進的智能建筑管理系統&#xff0c;通過數字孿生技術和3D可視化界面&#xff0c;實現對建筑設施的全方位、智能化管理。該平臺整合了物聯網(IoT)、大數據、人工智能和三維建…

湖北理元理律師事務所:債務重組中的技術賦能與法律邊界

一、當法律遇上算法&#xff1a;還款模型的進化 傳統債務協商依賴律師經驗&#xff0c;如今通過技術工具可實現&#xff1a; 輸入&#xff1a;用戶收入/債務/必需支出 輸出&#xff1a; 1. 法定可減免金額&#xff08;基于LPR與歷史判例庫&#xff09;&#xff1b; 2.…

對抗串擾的第一武器

痕量分離;長度平行度;stackup&#xff1a;有沒有一個脫穎而出&#xff1f; 我已經有一段時間沒有看到關于串擾的文章了&#xff0c;所以我決定借此機會為那些可能對為什么精通串擾的 PCB 設計人員和硬件工程師使用各種設計規則來控制串擾感興趣的 PCB 設計社區中的人簡要介紹一…

FastAPI:(11)SQL數據庫

FastAPI&#xff1a;(11)SQL數據庫 由于CSDN無法展示「漸構」的「#d&#xff0c;#e&#xff0c;#t&#xff0c;#c&#xff0c;#v&#xff0c;#a」標簽&#xff0c;推薦訪問我個人網站進行閱讀&#xff1a;Hkini 「漸構展示」如下&#xff1a; #c 概述 文章內容概括 #mermaid…

“智眸·家聯“項目開發(一)

嵌入式開發調試知識點總結&#xff08;含操作流程&#xff09; 我們今天解決問題的過程&#xff0c;就像是偵探破案&#xff0c;從最表面的線索&#xff08;網絡不通&#xff09;開始&#xff0c;一步步深入&#xff0c;最終找到了案件的核心&#xff08;硬件不匹配&#xff0…

展開說說Android之Retrofit詳解_使用篇

Retrofit是由Square公司開發的類型安全HTTP客戶端框架&#xff0c;借助動態代理在運行時生成接口實現類&#xff0c;將注解轉化為OkHttp請求配置&#xff1b;節省成本通過轉換器(Gson/Moshi)自動序列化JSON/XML&#xff0c;內部處理網絡請求在主線程返回報文。Retrofit 直譯是封…