14-C語言:第14天筆記

C語言:第14天筆記

內容提要

  • 指針
    • 變量指針與指針變量
      • 指針變量做函數參數
      • 指針變量指向數組元素
    • 數組指針與指針數組
      • 數組指針

回顧

變量指針與指針變量

變量指針:變量的地址值(首地址),本質是指針、地址

指針變量:存儲指針的變量,本質是變量

指針操作的兩個運算符

&:取地址運算符,作用是獲取指定對象的地址

*:指針操作符,如果這個符號前面有數據類型,就被稱作聲明指針;如果沒有,就被稱作解引用

關于指針中指向的問題

int a = 10;
int *p = &a   // 指針變量p指向對象a

指向:指針變量存儲了誰的地址,這個指針變量就指向了誰!

使用間接操作,如何交換a和b的值

  1. 交換指向:指向發生改變,指向對象的數據不會改變
  2. 交換數據:指向不發生改變,指向對象的數據會改變

關于指針變量

指針變量本質上還是變量,只不過指針變量只能存儲其他內存單元的地址,我們借助于指針變量,可以實現內存空間的共享。

關于共享

  1. 共享他人的空間

    int a = 10;
    int *p = &a;
    int *q = p;  // p和q共享a的空間
    
  2. 共享自己的空間

    int a = 10;
    int *p = &a;  // a和p共享a的空間
    

指針

變量指針與指針變量

指針變量做函數參數

指針變量做函數參數往往傳遞的是變量的首地址,借助于指針變量間接訪問是可以修改實參變量數據的。

指針有一個作用就是,通過形參修改實參,我們將這樣的參數稱之為輸出型參數

案例

需求:有a,b兩個變量,要求交換后輸出,使用函數處理,用指針變量做函數的參數

  • 方式1:交換指向(指針指向改變,指向對象的數據不變)

    代碼:

    #include <stdio.h>

    /**

    • 方式1:交換指向
      */
      void swap(int *p_a, int *p_b)
      {
      int *p_t;

      // 交換
      p_t = p_a;
      p_a = p_b;
      p_b = p_t;

      printf(“交換后:%d,%d\n”,*p_a, *p_b); // 交換后:4,3
      }

    int main(int argc,char *argv[])
    {
    int a = 3, b = 4;
    printf(“交換前:%d,%d\n”, a, b);// 交換前:3,4

    swap(&a, &b);  // 傳參的過程可以理解:int *p_a = &a, int *p_b = &b;return 0;
    

    }

    
    
  • 方式2:交換數據(指針指向不變,指向對象的數據改變)

    代碼:

    #include <stdio.h>

    /**

    • 方式2:交換數據
      */
      void swap(int *p_a, int *p_b)
      {
      int temp;

      // 交換
      temp = *p_a;
      *p_a = *p_b; // 將p_b指向對象的值賦給p_a指向的對象
      *p_b = temp; // p_b:訪問指針變量的空間,*p_b:訪問指針指向對象的空間

      printf(“交換后:%d,%d\n”,*p_a, *p_b); // 交換后:4,3
      }

    int main(int argc,char *argv[])
    {
    int a = 3, b = 4;
    printf(“交換前:%d,%d\n”, a, b);// 交換前:3,4

    swap(&a, &b);  // 傳參的過程可以理解:int *p_a = &a, int *p_b = &b;return 0;
    

    }

    
    
指針變量指向數組元素【重難點】
數組元素的指針
  • 數組的指針就是數組中第一個元素的地址,也就是數組的首地址。
  • 數組元素的指針是指數組的首地址。因此,同樣可以用指針變量來指向數組或者數組元素。
  • 在C語言中,由于數組名代表數組的首地址,因此數組名實際上也是指針。訪問數組名就是訪問數組首地址。

范例:

#include <stdio.h>int main(int argc,char *argv[])
{// 創建一個數組int arr[] = {11,22,33};int *p1 = &arr[0];  // 指針變量指向數組arr第一個元素,指針的范圍就是數組元素int *p2 = arr;      // 等價于上面寫法,數組名默認就是一個指向首元素地址的指針,推薦printf("%p,%p,%p\n", p1, p2, arr);  // 0x7ffe33135e2c,0x7ffe33135e2c,0x7ffe33135e2creturn 0;
}

注意:雖然我們定義了一個指針變量接收了數組地址,但不能理解為指針變量指向了數組,而應該理解為指向來了數組的元素(默認為第1個元素)。

指針的運算

指針運算:前提是指針變量必須要指向數組的某個元素。(指針運算只能在同一數組內進行,并且只能是元素之間的偏移

序號指針運算偏移量說明
1自增:p++、++p、p+=1sizeof(type)指向下一個元素的首地址
需邊界檢測,防止越界
2自減:p--、--p、p-=1sizeof(type)指向上一個元素的首地址
需邊界檢測,防止越界
3加n個數:p+nn * sizeof(type)指向后面n個元素的首地址
需邊界檢測,防止越界
4減n個數:p-nn * sizeof(type)指向前面n個元素的首地址
需邊界檢測,防止越界
5指針相減:p1 - p2`(p1 - p2)
6指針比較:p1 < p2邏輯值:真(1),假(0)前面的指針小于后面的指針

注意:

  • 上面表格中的type,是指針指向數組的元素的類型

  • sizeof不支持運算,舉例:

    #include <stdio.h>int main(int argc,char *argv[])
    {int a = 10;printf("sizeof(a)=%lu,sizeof(int)=%lu,sizeof(++a)=%lu\n", sizeof(a), sizeof(int), sizeof(++a)); // sizeof(a)=4,sizeof(int)=4,sizeof(a++)=4return 0;
    }

    說明

    ① 如果指針變量p已指向數組中的一個元素,則p+1指向同一數組中的 下一個元素,p-1指向同一數組中的上一個元素。即p+1或p-1也表示地址。但要注意的是,雖然指針變量p中存放的是地址,但p+1并不表示該地址加1,而表示在原地址的基礎上加了該數據類型所占的字節數d(d = sizeof(數據類型)) 。

    ② 如果p原來指向a[0],執行++p后p的值改變了,在p的原值基礎上加d,這樣p就指向數組的下一個元素a[1]。d是數組元素占的字節數。

    ③ 如果p的初值為&a[0]則p+i 和a+i 就是數組元素a[i]的地址,或者說,它們指向a數組的第 i 個元素 。

    *(p+i)或*(a+i)是p+i或a+i所指向的數組元素,即a[i]。

    ⑤ 如果指針變量p1和p2都指向同一數組,如執行p2-p1,結果是兩個地址之差除以數組元素的長度d。

案例
#include <stdio.h>
#include <math.h>int main(int argc,char *argv[])
{// 創建一個用來實現指針運算的數組int arr[] = {11,22,33,44,55};int *p1 = arr + 4;  // 55 等價于 arr[4]int *p2 = arr + 1;  // 22 等價于 arr[1]size_t size = fabs(p2 - p1); // 3 = fabs(22對應的地址 - 55對應的地址) / int的字節數printf("*p1=%d,*p2=%d,size=%lu,&arr[1]+2=%d\n", *p1, *p2, size, *(&arr[1]+2));return 0;
}

運行結果:
在這里插入圖片描述
在這里插入圖片描述

案例
  • 需求:通過下標法和指針法遍歷數組

  • 代碼:

    #include <stdio.h>/*** 下標法遍歷數組*/ 
    void arr1(int arr[], int len) // 數組作為函數參數,傳遞的是數組的首地址(數組被降級為指針)
    {for (register int i = 0; i < len; i++) printf("%-4d", arr[i]);printf("\n");
    }/*** 指針法遍歷數組*/ 
    void arr2(int arr[], int len)
    {// 創建一個指針變量,接收數組,此時實際上接收到的是數組中第一個元素的地址int *p = arr;for (register int i = 0; i < len; i++) printf("%-4d",/* *(arr+i) 等價于*/ *(p+i));printf("\n");
    }/*** 指針法遍歷數組*/ 
    void arr3(int arr[], int len)
    {int *p = arr;for (register int i = 0; i < len; i++){printf("%-4d", *p);p++;}printf("\n");
    }/*** 指針法遍歷數組*/ 
    void arr4(int arr[], int len)
    {int *p = arr;for(; p < arr + len; p++) // 判斷的時候不能寫作 p + len,因為p在變化,而arr沒有變化{printf("%-4d", *p);}printf("\n");
    }int main(int argc,char *argv[])
    {int arr[] = {11,22,33,44,55};int len = sizeof(arr) / sizeof(arr[0]);arr1(arr, len);arr2(arr, len);arr3(arr, len);arr4(arr, len);return 0;
    }
案例
  • 需求:推導以下代碼的運行結果

  • 代碼:

    
    #include <stdio.h>int arr2()
    {// 創建一個普通數組int arr[] = {11,22,33,44,55,66,77,88};int *p = arr;printf("%d\n", *p);  // 11p++;  // 指針偏移 1 * sizeof(int) 指針移動到22這個位置printf("%d\n", *p);  // 22int x = *p++;  // 第1步:解引用p的值賦值給x, x = 22; 第2步:p++,指針移動到33這個位置printf("%d,%d\n", x, *p);// 22,33int y = *(++p);// 第1步:++p,指針偏移到44這個位置;第2步:對44這個地址解引用,得到44printf("%d,%d\n", y, *p);// 44,44(*p)++;        // 第1步:對p解引用得到44;第2步:對44這個值+1,得到45printf("%d\n",*p); // 45
    }
    

※小貼士

*p++:先解引用p,然后p這個指針自增(指針自增)

 int arr[] = {11,22,33}, *p = arr;int x = *p++; // x=11,*p=22   ① *p解引用,其實就是將指向的對象a的值賦值給x ② 指針p++,也就是指針偏移一位

(*p)++:先解引用p,然后使用解引用出來的數據自增(數值自增)

 int arr[] = {11,22,33}, *p = arr;int x = (*p)++; // x=11,*p=12   ① *p解引用,其實就是將指向的對象a的值賦值給x ② 解引用出來的對象數據自增
通過指針引用數組元素

引用一個數組元素,可以用:

① 下標法:如arr[i]

② 指針法:如*(arr + 1) 或者*(p+i)。其中arr是數組名,p是指向數組元素的指針變量,其初始值:p = arr;

案例

需求:

  • 下標法:(通過改變下標輸出所有元素)

    #include <stdio.h>int main()
    {int arr[10], i;// 給數組元素賦值for (i = 0; i < 10; i++) scanf("%d", &arr[i]);// 遍歷數組元素for (i = 0; i < 10; i++) printf("%-4d", arr[i]);printf("\n");return 0;
    }
    
  • 指針法(地址):(通過數組名計算出數組元素的地址,找出數組元素值)

    #include <stdio.h>int main()
    {int arr[10], i;// 給數組元素賦值for (i = 0; i < 10; i++) scanf("%d", &arr[i]);// 遍歷數組元素for (i = 0; i < 10; i++) printf("%-4d", *(arr + i));   printf("\n");return 0;
    }
    
  • 指針法(指針變量):(用指針變量指向數組元素)

    #include <stdio.h>int main()
    {int arr[10], i, *p;// 給數組元素賦值for (i = 0; i < 10; i++) scanf("%d", &arr[i]);// 遍歷數組元素for (p = arr; p < (arr + 10); p++) printf("%-4d", *p);printf("\n");return 0;
    }
    

    注意:數組一旦創建,就無法改變其值。

    以上3種寫法比較:

    • 第①種寫法和第②種寫法執行效率相同。系統是將arr[i]轉換為*(arr+i)處理的,即先計算出地址,因此比較費時。
    • 第③種方法比第①②種方法快。用指針變量直接指向數組元素,不必每次都重新計算地址。(p++)能大大提高執行效率。
    • 用第①種寫法比較直觀,而用地址法或者指針變量的方法難以很快判斷出當前處理的元素。

    使用指針變量指向數組元素時(上面第③種寫法),注意以下前兩點:

    *(p--) 相當于arr[i--],先*p,再p--; *(p++) 相當于arr[i++],先*p,再p++;

    *(--p) 相當于arr[--i],先--p,再* *(++p) 相當于arr[++i],先++p,再*;

    *p++ 先*p,再p++

    (*p)++ 先*p,再*p++

    具體關系參照下面表格:

    操作類型指針表達式數組下標等價執行順序指針移動方向是否改變指針地址
    前置自減+取值*(--p)arr[--i]1. 指針前移
    2. 取新地址的值
    向前(←)
    前置自加+取值*(++p)arr[++i]1. 指針后移
    2. 取新地址的值
    向后(→)
    后置自減+取值*(p--)arr[i--]1. 取原地址的值
    2. 指針前移
    向前(←)
    后置自加+取值*(p++)arr[i++]1. 取原地址的值
    2. 指針后移
    向后(→)
    后置自減(簡寫)*p--arr[i--]1. 取原地址的值
    2. 指針前移
    向前(←)
    后置自加(簡寫)*p++arr[i++]1. 取原地址的值
    2. 指針后移
    向后(→)
    取值后值自減(*p)--arr[i]--1. 取原地址的值
    2. 值-1
    不移動×
    取值后值自加(*p)++arr[i]++1. 取原地址的值
    2. 值+1
    不移動×
數組名作函數參數

① 形參和實參都是數組名

// arr 數組 形參
void fun(int arr[], int len){..}void main()
{int arr[] = {11,22,33};int len = sizeof(arr) / sizeof(arr[0]);// arr 數組 實參fun(arr, len);
}

② 實參用數組名,形參用指針變量

// arr 指針 形參
void fun(int *arr, int len){..}void main()
{int arr[] = {11,22,33};int len = sizeof(arr) / sizeof(arr[0]);// arr 數組 實參fun(arr, len);
}

③ 實參和形參都用指針變量

// arr 指針 形參
void fun(int *arr, int len){..}void main()
{int arr[] = {11,22,33};int len = sizeof(arr) / sizeof(arr[0]);// arr 指針 實參int *p = arr;fun(p, len);
}

④ 實參用指針,形參用數組名

// arr 數組 形參
void fun(int arr[], int len){..}void main()
{int arr[] = {11,22,33};int len = sizeof(arr) / sizeof(arr[0]);// arr 指針 實參int *p = arr;fun(p, len);
}
案例:

需求:將數組a中的n個整數按相反順序存放(數組反轉)

分析:

在這里插入圖片描述

代碼:


#include <stdio.h>/*** 數組的反轉:下標法*/ 
void inv1(int arr[], int len)
{// 反轉思路:第0個和最后一個交換,第1個和倒數第二個交換...// 定義循環變量和臨時變量register int i = 0, temp;// 遍歷數組for (; i < len/2; i++){temp = arr[i];arr[i] = arr[len-1-i];arr[len-1-i] = temp;}
}/*** 數組的反轉:指針法*/ 
void inv2(int *p, int len)
{// 反轉思路:第0個和最后一個交換,第1個和倒數第二個交換...// 定義循環變量和臨時變量int *i = p, *j = p + len - 1, temp;// 遍歷數組for (; i < j; i++, j--){temp = *i;*i = *j;*j = temp;}
}/*** 遍歷數組*/ 
void list(const int *arr, int len)  // const int *arr = arr;
{const int *p = arr; // 添加const之后,指針指向對象的值不變,指針指向可以改變for (; p < arr + len; p++) printf("%-4d", *p); printf("\n");
}int main(int argc,char *argv[])
{int arr[] = {11,12,13,14,15};int len = sizeof(arr) / sizeof(arr[0]);list(arr, len);inv1(arr, len);list(arr, len);inv2(arr, len);list(arr, len);return 0;
}

數組指針與指針數組

數組指針
定義

**概念:**數組指針是指向數組的指針(指針變量),本質上還是指針。

指針變量指向數組元素和數組指針的區別?

在這里插入圖片描述

特點:

① 先有數組,再有指針

② 它指向的是一個完整的數組

一維數組指針

語法:

數據類型 (*指針變量名)[容量];

案例:


#include <stdio.h>int main(int argc,char *argv[])
{// 一維數組指針int arr[] = {100,200,300};int len = sizeof(arr) / sizeof(arr[0]);// 定義一個數組指針(一維數組指針)int (*p)[len] = &arr; // arr默認指向數組元素,&arr指向整個數組,需要注意的的是,它們表示的范圍不同,地址相同// p++:此時不能p++,否則會越界printf("&arr=%p,arr=%p,&arr[0]=%p\n", &arr, arr, &arr[0]); // arr 等價于 &arr[0]// 如何訪問數組指針printf("%d\n", (*p)[2]); // 300// 遍歷數組指針for (int i = 0; i < len; i++) printf("%-6d", (*p)[i]); printf("\n");return 0;
}

我們之前所學的是指向數組元素的指針,本質上是指針變量;現在我們學的是指向數組的指針,叫作數組指針。

二維數組指針

語法:

數據類型 (*指針變量名)[行容量][列容量];

案例:

  • 寫法1:二維數組指針指向二維數組【不推薦】

    #include <stdio.h>int main(int argc,char *argv[])
    {// 創建一個二維數組int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};// 定義一個二維數組指針指向二維數組int (*p)[][3] = &arr;// 遍歷數組for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%-6d", (*p)[i][j]);}}printf("\n");return 0;
    }
  • 寫法2:一維數組指針指向二維數組【推薦】

    #include <stdio.h>int main(int argc,char *argv[])
    {// 創建一個二維數組int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};// 定義一個一維數組指針指向二維數組,相當于指針指向的是二維數組的行 [行容量]int (*p)[3] = arr; // 等價于 &arr[0] (*p):指向數組的行   int arr[] = {100, 200, 300}; int *p = arr;  解引用p 得到第一個元素// 遍歷數組for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%-6d", p[i][j]);// printf("%-6d", *(*(p+i)+j));// printf("%-6d", (*(p+i))[j]);// printf("%-6d", *(p[i]+j));}}printf("\n");return 0;
    }

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

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

相關文章

【筆記】活度系數推導

文章目錄一、理想溶液的假設與局限性1.1 理想溶液的定義1.2 理想溶液的局限性二、活度與活度系數的引入2.1 活度的定義2.2 修正后的化學勢表達式三、活度系數的物理意義四、為什么需要活度系數&#xff1f;4.1 理論需求4.2 擴散理論中的必要性五、活度系數的具體作用5.1 在化學…

基于Docker的GPU版本飛槳PaddleOCR部署深度指南(國內鏡像)2025年7月底測試好用:從理論到實踐的完整技術方案

還是網上沒找到這個基于Docker的GPU版本飛槳PaddleOCR部署教程&#xff0c;于是就有了這一篇。 這個的確坑很多&#xff0c;可能后面變一個版本就不好用了&#xff0c;也是為什么這篇博客不完全粘貼代碼的原因。 端口是示例&#xff0c;可以隨意改。在人工智能與文檔數字化高速…

Python-初學openCV——圖像預處理(三)

目錄 一、邊緣填充 1、邊界復制 2、邊界反射 3、邊界反射101 4、邊界常數 5、邊界包裹 二、透視變換 三、圖像掩膜 1、制作掩膜 2、與運算 3、顏色替換 四、ROI切割 五、圖像添加水印 一、邊緣填充 我們對圖像進行處理后&#xff0c;需要對空出來的區域進行一個填充…

【ESP32設備通信】-W5500與ESP32 /ESP32 S3集成

W5500與ESP32 /ESP32 S3集成 文章目錄 W5500與ESP32 /ESP32 S3集成 1、W5500介紹 2、硬件準備與接線 3、代碼實現 3.1 以太網設置 3.2 簡單HTTP請求 3.3 HTTPS請求 3.4 查詢證書 ESP32 憑借其強大的 Wi-Fi 功能,一直是物聯網項目的熱門選擇。ESP32 現在支持帶有 SSL 的原生以太…

vue - 使用canvas繪制驗證碼

封裝繪制驗證碼 verify-code.vue<template><div class"captcha"><canvas ref"canvasRef" :width"width" :height"height" click"refreshCaptcha"></canvas></div> </template><scri…

[10月考試] F

[10月考試] F 題目描述 給定長度為 nnn 的序列 ana_nan?&#xff0c;保證 aia_iai? 為非負整數。 mmm 次詢問&#xff0c;每次給定區間 l,rl,rl,r&#xff0c;求出 al,al1,…,ara_l,a_{l1},\ldots,a_ral?,al1?,…,ar? 的 mexmexmex。 對于一個序列&#xff0c;定義其 mexm…

收集了全球55個AI寫作工具

我們即將推出一整套AI生產力工具矩陣&#xff0c;覆蓋內容創作&#xff08;AI寫作助手&#xff09;、視覺設計&#xff08;智能圖像處理&#xff09;、音視頻制作&#xff08;自動轉錄與編輯&#xff09;及智能編程等多個核心領域。這些解決方案通過先進的機器學習算法&#xf…

Elastic 勞動力的生成式 AI:ElasticGPT 的幕后解析

作者&#xff1a;來自 Elastic Jay Shah, Adhish Thite ElasticGPT — 由 Elastic 提供支持&#xff0c;專為 Elastic 打造 ElasticGPT 是我們基于檢索增強生成&#xff08;RAG&#xff09;框架構建的內部生成式 AI &#xff08;GenAI&#xff09;助手。它是使用 Elastic 自有…

CS231n-2017 Assignment1

KNN&#xff1a;這里要求我們完成一個KNN分類器&#xff0c;實現對圖片使用KNN算法進行分類標簽k_nearest_neighbor.py這里要求我們完成4個接口# X:測試集 # 使用兩個循環 def compute_distances_two_loops(self, X):num_test X.shape[0]num_train self.X_train.shape[0]dist…

[python][flask]Flask-Principal 使用詳解

Flask-Principal 是一個專為 Flask 應用設計的身份管理和權限控制擴展。它能夠幫助開發者輕松實現用戶身份驗證和權限管理&#xff0c;從而提升應用的安全性和用戶體驗。該項目最初由 Ali Afshar 開發&#xff0c;現已成為 Pallets 社區生態系統的一部分&#xff0c;由社區共同…

抖音與B站爬蟲實戰,獲取核心數據

本文將深入講解兩大主流短視頻平臺&#xff08;抖音、B站&#xff09;的爬蟲實戰技術&#xff0c;提供可直接運行的代碼解決方案&#xff0c;并分享突破反爬機制的核心技巧。一、平臺特性與爬蟲難點對比平臺數據價值主要反爬措施推薦抓取方式抖音視頻數據、用戶畫像、熱榜簽名驗…

WSL切換網絡模式

WSL切換網絡模式問題WSL從NAT改成MIRRORED找到WSL Setting修改配置重啟電腦&#xff08;注意不是重啟WSL&#xff09;運行pio run驗證IP問題 從魚香ROS買了一個小魚車&#xff0c;開始學習&#xff0c;然而裝環境都要搞死我了。 垃圾VirtualBox我新買的電腦&#xff0c;裝個Vi…

[Linux入門] Linux 遠程訪問及控制全解析:從入門到實戰

目錄 一、SSH 遠程管理&#xff1a;為什么它是遠程訪問的首選&#xff1f; 1??什么是 SSH&#xff1f; 2??SSH 為什么比傳統工具更安全&#xff1f; 3??SSH 的 “三大組成部分” 4??SSH 工作的 “五步流程” 5??常用 SSH 工具 二、實戰&#xff1a;構建 SSH 遠…

n8n AI資訊聚合與分發自動化教程:從數據獲取到微信與Notion集成

引言 n8n簡介&#xff1a;自動化工作流利器 n8n是一款功能強大的開源自動化工具&#xff0c;采用獨特的“公平代碼”&#xff08;Fair-Code&#xff09;許可模式&#xff0c;旨在幫助用戶連接各種應用程序和服務&#xff0c;從而實現工作流的自動化。它通過直觀的可視化界面&am…

遞歸查詢美國加速-技術演進與行業應用深度解析

在當今數據驅動的時代&#xff0c;遞歸查詢已成為處理層級數據的核心技術&#xff0c;尤其在美國科技領域獲得廣泛應用。本文將深入解析遞歸查詢在美國加速發展的關鍵因素&#xff0c;包括技術演進、行業應用場景以及性能優化策略&#xff0c;幫助讀者全面理解這一重要技術趨勢…

【AIGC專欄】WebUI實現圖片的縮放

圖片的縮放包含如下的各類不同的縮放模型。 Lanczos Lanczos重采樣是一種數學上精確的方法,用于圖像放大或縮小。它使用了一種稱為 sinc 函數的數學公式,可以在保留圖像細節的同時減少鋸齒效應。 Nearest 最近鄰插值是一種簡單的圖像放大方法,通過復制最近的像素值來填充新…

Libevent(4)之使用教程(3)配置

Libevent(4)之使用教程(3)配置事件 Author: Once Day Date: 2025年7月27日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 本文檔翻譯于&#xff1a;Fast portable non-bl…

若依前后端分離版學習筆記(三)——表結構介紹

前言&#xff1a; 這一節將ruoyi框架中數據庫中的表結構過一遍&#xff0c;查看都有哪些表及其表結構及關聯關系&#xff0c;為后續代碼學習做準備。 一 代碼生成表記錄代碼生成的業務表及相關字段1 代碼生成業務表 CREATE TABLE gen_table (table_id bigint(20) NOT NULL AUTO…

NFS服務安裝與使用

概述 內網需要使用NFS服務掛載到其他服務器&#xff0c;用做數據備份使用。 安裝 # Centos yum install -y nfs-utils # Ubuntu apt install nfs-common配置 # 編輯 vim /etc/exports # 輸入內容 /public/KOL-ESbackup 172.29.1.0/24 192.168.8.63 192.168.8.64 192.168.8.65(r…

使用adb 發送廣播 動態改變app內的值

前言 在開發過程中有時候我們需要做一些調試工作。可以通過adb發送廣播實現。 廣播注冊 注意最后一個參數&#xff0c;Context.RECEIVER_EXPORTED 這是Android 34以后強制要求的&#xff0c;方便外部發送這個廣播。否則會報錯val filter IntentFilter()filter.addAction("…