【C語言系列】深入理解指針(5)

深入理解指針(5)

  • 一、sizeof和strlen的對比
    • 1.1sizeof
    • 1.2strlen
    • 1.3sizeof和strlen的對比
  • 二、數組和指針筆試題解析
    • 2.1 一維數組
    • 2.2 字符數組
      • 2.2.1代碼1:
      • 2.2.2代碼2:
      • 2.2.3代碼3:
      • 2.2.4代碼4:
      • 2.2.5代碼5:
      • 2.2.6代碼6:
    • 2.3 二維數組
  • 三、指針運算筆試題解析
    • 3.1題目1:
    • 3.2題目2:
    • 3.3題目3:
    • 3.4題目4:
    • 3.5題目5:
    • 3.6題目6:
    • 3.7題目7:
  • 四、總結
      • 1. `sizeof`與`strlen`的區別
      • 2. 數組和指針的關系
      • 3. 字符數組與字符串
      • 4. 指針運算
      • 總結

一、sizeof和strlen的對比

1.1sizeof

sizeof單目操作符絕不是函數!!!),sizeof計算變量所占內存空間的大小的,單位是字節。
如果操作數是類型的話,計算的是使用類型創建的變量所占內存空間的大小。
注:sizeof只關注占用內存空間的大小,不在乎內存中存放什么數據。
比如:

 #inculde <stdio.h>int main(){int a = 10;printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(int));return 0;}

1.2strlen

strlen是C語言庫函數功能是求字符串長度。
函數原型是:

size_t strlen ( const char * str );

統計的是從strlen函數的參數str中這個地址開始向后,\0之前字符串中字符的個數。
注:strlen 函數會一直向后找 \0 字符,直到找到為止,所以可能存在越界查找。
代碼如下:

#include <stdio.h>
int main()
{char arr1[3] = {'a', 'b', 'c'};char arr2[] = "abc";printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));printf("%d\n", sizeof(arr1));printf("%d\n", sizeof(arr2));return 0;
}

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

1.3sizeof和strlen的對比

sizeofstrlen
1.sizeof是操作符1.strlen是庫函數,使用需要包含頭文件string.h
2.sizeof計算操作數所占內存的大小,單位是字節2.strlen是求字符串長度的,統計的是\0之前字符的個數
3.不關注內存中存放什么數據3.關注內存中是否有\0,如果沒有\0,就會持續往后找,可能會越界
4.sizeof括號中有表達式的話,表達式是不參與計算的!!!

用代碼檢驗4,代碼如下:

#include <stdio.h>
int main()
{
int a = 8;
short s = 4;
printf("%d\n",sizeof(s = a + 2));//2
printf("%d\n",s);//4
return 0;
}

運行結果如下:
在這里插入圖片描述
那么為什么sizeof中的表達式不計算?
C語言是編譯型語言,在編譯期這個表達式并不會被執行,sizeof 運算的結果是在編譯期間就已知的常數值,并不需要等到運行時才求解。因此,對于其中涉及到的操作數或者操作本身都不需要實際執行。

二、數組和指針筆試題解析

2.1 一維數組

*a == a[0] == *(a + 0)
數組名的理解:數組名是數組首元素(第一個元素)的地址。
但是有2個是例外:1.sizeof(數組名) —— 數組名表示整個數組,計算的是整個數組的大小,單位是字節。
2.&數組名 —— 數組名表示的是整個數組,取出的是整個數組的地址。
除此之外,所有的數組名是數組首元素(第一個元素)的地址。

筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
int a[] = {1,2,3,4};//數組有幾個元素?//4
printf("%zd\n",sizeof(a));//16
printf("%zd\n",sizeof(a + 0));//a是首元素的地址 —— 類型是int*,a + 0還是首元素的地址,是地址大小就是4/8。
printf("%zd\n",sizeof(*a));//a是首元素的地址,*a是首元素,大小就是4個字節。
printf("%zd\n",sizeof(a + 1));//a是首元素地址,類型是int*,a + 1跳過1個整型,a + 1就是第二個元素的地址,是地址大小就是4/8。
printf("%zd\n",sizeof(a[1]));//a[1]就是第二個元素,大小是4個字節。
printf("%zd\n",sizeof(&a));//&a是數組的地址,數組的地址也是地址,是地址大小就是4/8字節。
printf("%zd\n",sizeof(*&a));//1.*&互相抵消了,等價于sizeof(a),16
//2.&a是數組的地址,類型是int(*)[4],對數組指針解引用訪問的是數組,計算的是數組的大小,16
//char* —— 解引用訪問的是char
//int* —— 解引用訪問的是int
printf("%zd\n",sizeof(&a + 1));//&a + 1是跳過這個數組后的那個位置的地址,是地址大小就是4/8字節。
printf("%zd\n",sizeof(&a[0]));//首元素的地址,大小就是4/8字節。
printf("%zd\n",sizeof(&a[0] + 1));//&a[0] + 1 —— 數組第二個元素的地址,大小就是4/8字節。
return 0;
}

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

2.2 字符數組

2.2.1代碼1:

筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",sizeof(arr));//數組名單獨放在sizeof內部,計算的是數組的大小,單位為字節,6。
printf("%d\n",sizeof(arr + 0));//arr是數組名表示首元素的地址,arr + 0還是首元素的地址,是地址就是4/8字節。
printf("%d\n",sizeof(*arr));//arr是首元素的地址,*arr就是首元素,大小就是1個字節。
//*arr == arr[0] == *(arr + 0)
printf("%d\n",sizeof(arr[1]));//arr[1]是第二個元素,大小也是1個字節。
printf("%d\n",sizeof(&arr));//&arr是數組的地址,數組的地址也是地址,是地址大小就是4/8個字節。
//&arr —— char(*)[6]
printf("%d\n",sizeof(&arr + 1));//4/8個字節,&arr + 1,跳過整個數組,指向了數組后邊的空間。
printf("%d\n",sizeof(&arr[0] + 1));//第二個元素的地址,是地址就是4/8個字節。
return 0;
}

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

2.2.2代碼2:

筆試題代碼和解析如下:

#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n",strlen(arr));//arr是首元素的地址,數組中沒有\0,就會導致越界訪問,結果就是隨機的。
printf("%d\n",strlen(arr + 0));//arr + 0是數組首元素的地址,數組中沒有\0,就會導致越界訪問,結果就是隨機的。
printf("%d\n",strlen(*arr));//arr是首元素的地址,*arr是首元素,就是'a','a'的ASCII碼值是97,就相當于97作為地址傳遞給了strlen,strlen得到的就是野指針,代碼是有問題的。
printf("%d\n",strlen(arr[1]));//arr[1] —— 'b' —— 98,傳給strlen函數也是錯誤的。
printf("%d\n",strlen(&arr));//&arr是數組的地址,起始位置是數組的第一個元素的位置,隨機值。
printf("%d\n",strlen(&arr + 1));//隨機值。
printf("%d\n",strlen(&arr[0] + 1));//從第二個元素開始向后統計的,得到的也是隨機值。
return 0;
}

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

2.2.3代碼3:

筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n",sizeof(arr));//7,計算的是數組總大小,數組名單獨放在sizeof內部。
printf("%d\n",sizeof(arr + 0));//arr表示數組首元素的地址,arr + 0還是首元素的地址,4/8字節。
printf("%d\n",sizeof(*arr));//arr表示數組首元素的地址,*arr是首元素,大小是1字節。
printf("%d\n",sizeof(arr[1]));//arr[1]是第二個元素,大小是1個字節。
printf("%d\n",sizeof(&arr));//&arr是數組的地址,是地址就是4/8字節。
printf("%d\n",sizeof(&arr + 1));//&arr是數組的地址,是地址就是4/8字節。
printf("%d\n",sizeof(&arr[0] + 1));//&arr是數組的地址,+1跳過整個數組,還是地址,是地址就是4/8字節。
return 0;
}

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

2.2.4代碼4:

筆試題代碼和解析如下:

#include <stdio.h>
#include <string.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n",strlen(arr));//6
printf("%d\n",strlen(arr + 0));//arr首元素的地址,arr + 0還是首元素的地址,向后統計在\0之前的字符個數。//6
printf("%d\n",strlen(*arr));//'a' —— 97,出錯。
printf("%d\n",strlen(arr[1]));//'b' —— 98.出錯。
printf("%d\n",strlen(&arr));//&arr是數組的地址,也是從數組第一個元素開始向后找,6。
printf("%d\n",strlen(&arr + 1));//隨機值。
printf("%d\n",strlen(&arr[0] + 1));//5
//&arr —— char(*)[7]
//size_t strlen(const char*s);
return 0;
}

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

2.2.5代碼5:

筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
const char*p = "abcdef";
printf("%d\n",sizeof(p));//p是指針變量,我們計算的是指針變量的大小,4/8個字節。
printf("%d\n",sizeof(p + 1));//p + 1是b的地址,是地址大小就是4/8個字節。
printf("%d\n",sizeof(*p));//p的類型是char*,*p就是char類型了,1個字節。
printf("%d\n",sizeof(p[0]));//1.p[0]->*(p + 0)->*p->'a',大小1個字節。
//1.把常量字符串想象成數組。
//2.p可以理解為數組名,p[0],就是首元素。
printf("%d\n",sizeof(&p));//取出的是p的地址,地址的大小就是4/8個字節。
printf("%d\n",sizeof(&p + 1));//&p + 1是跳過p指針變量后的地址,地址的大小是4/8個字節。
printf("%d\n",sizeof(&p[0] + 1));//4/8,取出首元素的地址,+1是第二個字符的地址。
return 0;
}

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

2.2.6代碼6:

筆試題代碼和解析如下:

#include <stdio.h>
#include <string.h>
int main()
{
char*p ="abcdef";
printf("%d\n",strlen(p));//6
printf("%d\n",strlen(p + 1));//5
printf("%d\n",strlen(*p));//*p就是'a' —— 97,err
printf("%d\n",strlen(p[0]));//p[0]->*(p + 0)->*p//err
printf("%d\n",strlen(&p));//&p是指針變量p的地址,和字符串“abcdef”關系就不大了,從p這個指針變量的起始位置開始向后數的,p變量存放的地址是什么,不知道,所以答案是隨機值。
printf("%d\n",strlen(&p + 1));//隨機值
printf("%d\n",strlen(&p[0] + 1));//5
return 0;
}

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

2.3 二維數組

二維數組筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
int a[3][4] = {0};
printf("%d\n",sizeof(a));//a是數組名,單獨放在sizeof內部,計算的是數組的大小,單位是字節 —— 48 = 3*4*sizeof(int)。
printf("%d\n",sizeof(a[0][0]));//a[0][0]第一行第一個元素,大小是4個字節。
printf("%d\n",sizeof(a[0]));//a[0]是第一行的數組名,數組名單獨放在sizeof內部了,計算的是數組的總大小16個字節。
printf("%d\n",sizeof(a[0] + 1));//a[0]并沒有單獨放在sizeof內部,所以這里的數組名a[0]就是數組首元素的地址,即a[0]->&a[0][0],+1后是&a[0][1]的地址,大小是4/8個字節。
printf("%d\n",sizeof(*(a[0] + 1)));//第一行第一個元素,大小是4
printf("%d\n",sizeof(a + 1));//a作為數組名并沒有單獨放在sizeof內部,a表示數組首元素的地址,是二維數組首元素的地址,也就是第一行的地址,a + 1,跳過一行,指向了第二行,a + 1是第二行的地址,a + 1是數組指針,是地址大小就是4/8個字節。
printf("%d\n",sizeof(*(a + 1)));//1.a + 1是第二行的地址,*(a + 1)就是第二行,計算的是第二行的大小 —— 16。2.*(a + 1) == a[1],a[1]是第二行的數組名,sizeof(*(a + 1))就相當于sizeof(a[1]),意思就是把第二行的數組名單獨放在sizeof內部,計算的是第二行的大小。
printf("%d\n",sizeof(&a[0] + 1));//a[0]是第一行的數組名,&a[0]取出的就是數組的地址,就是第一行的地址,&a[0] + 1就是第二行的地址,是地址大小就是4/8字節。
printf("%d\n",sizeof(*(&a[0] + 1)));//對第二行地址解引用,訪問的就是第二行,大小是16個字節。
printf("%d\n",sizeof(*a));//a作為數組名并沒有單獨放在sizeof內部,a表示數組首元素的地址,是二維數組首元素的地址,也就是第一行的地址,*a就是第一行,計算的就是第一行的大小,16個字節。
printf("%d\n",sizeof(a[3]));//a[3]無需真實存在,僅僅通過類型的推斷就能算出長度,a[3]是第四行的數組名,單獨放在sizeof內部,計算第四行的大小,16個字節。
//sizeof(int);//4
//sizeof(3+5);//4
return 0;
}

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

三、指針運算筆試題解析

3.1題目1:

指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
int a[5] = {1,2,3,4,5};
int*ptr = (int*)(&a + 1);//&a —— int(*)[5]
printf("%d %d",*(a + 1),*(ptr - 1));//ptr跳過了原來a數組指向下一個位置,*(ptr-1)訪問的就是數組a中的5。
return 0;
}

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

3.2題目2:

在X86(32位)環境下,假設結構體的大小是20個字節,程序輸出的結果是什么?
指針運算筆試題代碼和解析如下:

#include <stdio.h>
struct Test
{
int Num;
char*PcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;//結構體指針+1,跳過一個結構體;整型值+1,就是+1。
//指針+-整數
int main()
{
printf("%p\n",p + 0x1);//0x100000 + 20 -> 00100014
printf("%p\n",(unsigned long)p + 0x1);//0x100000 + 1 ->0x100001 -> 00100001
printf("%p\n",(unsigned int*)p + 0x1);//0x100000 + 4 -> 0x100004 -> 00100004
return 0;
}

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

3.3題目3:

指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
int a[3][2] = {(0,1),(2,3),(4,5)};//1 3 5//初始化
int*p;
p = a[0];//&a[0][0];
printf("%d",p[0]);//1//*(p + 0) -> *p
return 0;
}

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

3.4題目4:

假設環境是X86環境,程序的輸出結果是什么?
指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{//%d —— 是打印有符號的整數
//%p —— 是打印地址的
int a[5][5];//a —— 類型是:int(*)[5]
int(*p)[4];//p —— 類型是:int(*)[4]//p是一個數組指針,p指向的數組是4個整型元素的
p = a;//類型的差異 —— 警告
printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);//FFFFFFFC,-4
return 0;
}
//指針-指針絕對值得到的是指針和指針之間的元素個數

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

3.5題目5:

指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
int*ptr1 = (int*)(&aa + 1);
int*ptr2 = (int*)(*(aa + 1));
printf("%d %d",*(ptr1 - 1),*(ptr2 - 1));//10 5
return 0;
}
//*(aa + 1)->aa[1],aa[1]是第二行的數組名,數組名表示首元素的地址。
//aa[1]也是&aa[1][0]
//*(aa + 1)->aa[1],&aa[1]->第二行的地址
//sizeof(aa[1])->計算的是第二行的大小

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

3.6題目6:

指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
char*a[] = {"work","at","alibaba"};//a是指針數組
char**pa = a;
pa++;
printf("%s\n",*pa);//at//%s是打印字符串,給一個地址,從這個地址向后打印字符串,直到\0
return 0;
}

畫圖分析:
在這里插入圖片描述

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

3.7題目7:

指針運算筆試題代碼和解析如下:

#include <stdio.h>
int main()
{
char*c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c + 3,c + 2, c + 1,c};
char***cpp = cp;
printf("%s\n",**++cpp);//POINT
printf("%s\n",*--*++cpp + 3);//ER
printf("%s\n",*cpp[-2] + 3);//**(cpp - 2) + 3//ST
printf("%s\n",cpp[-1][-1] + 1);//*c*(cpp-1) - 1//EW
return 0;
}

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

四、總結

本文深入探討了C語言中關于sizeofstrlen、數組和指針的一些基礎概念,并通過代碼示例進行了詳細的講解。以下是對主要內容的總結:

1. sizeofstrlen的區別

sizeof是一個運算符,用于計算變量或類型所占的內存空間大小,單位是字節。它與數據存儲內容無關,只關注內存的占用。例如,sizeof(int)會返回一個整數類型的大小,而sizeof(a)會返回數組a的總字節數。需要注意的是,sizeof中的表達式不會被計算,僅僅是編譯時確定的常量。

與此不同,strlen是C標準庫中的一個函數,用于計算以'\0'(空字符)結尾的字符串的長度。它統計的是字符串中的字符個數,而不包括'\0'字符。因此,strlen在處理字符串時,必須確保字符串正確地以'\0'結尾,否則可能導致越界訪問。

2. 數組和指針的關系

數組和指針是C語言中常見的概念,它們密切相關。數組名通常被認為是指向數組首元素的指針。通過數組名,可以訪問數組的元素,但是數組名和指針在某些情況下也有所不同。例如,sizeof(a)計算的是整個數組的大小,而sizeof(a + 1)計算的是數組中某個元素的指針大小。此外,數組名也可以通過&a表示整個數組的地址,&a[0]表示數組首元素的地址。

3. 字符數組與字符串

字符數組在內存中的存儲方式可能導致不同的行為。在沒有'\0'結尾的情況下,使用strlen函數可能會導致越界訪問,進而產生隨機結果。通過具體的代碼示例,文章展示了不同數組類型在使用sizeofstrlen時的差異,特別是字符數組和字符串常量。

4. 指針運算

指針運算是C語言中強大的功能之一。指針可以進行加減操作,指向內存中的不同位置。通過對數組指針進行運算,可以訪問數組中的不同元素。指針間的運算遵循指針類型的大小,比如int*指針加1時會跳過一個int類型的大小,指向下一個int類型的數據。文章通過一系列例子展示了指針和數組在內存中的操作,包括指針的解引用、指針數組的運算等。

總結

本篇文章深入分析了sizeofstrlen、數組與指針等概念,并通過一系列代碼示例加深了對這些概念的理解。對于初學者來說,掌握這些基礎知識是學習C語言的關鍵。文章不僅揭示了這些基本概念的使用方法,還通過具體例子幫助理解如何避免常見的錯誤,如越界訪問和指針運算中的誤解。

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

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

相關文章

標志的推理

下面的討論是我對《對編程實現擬人智能可行性的論證》這篇文章的“賦值與對象的標志”這一節的展開討論。 標志能夠使我們更好的思維&#xff08;比如用輪廓標記物體對象&#xff0c;用興奮強度標記回憶情況等等&#xff09;。有思維標志、信息標志&#xff0c;單純標志、組合…

【藍橋杯嵌入式】2_LED

1、電路圖 74HC573是八位鎖存器&#xff0c;當控制端LE腳為高電平時&#xff0c;芯片“導通”&#xff0c;LE為低電平時芯片“截止”即將輸出狀態“鎖存”&#xff0c;led此時不會改變狀態&#xff0c;所以可通過led對應的八個引腳的電平來控制led的狀態&#xff0c;原理圖分析…

Diskgenius系統遷移之后無法使用USB啟動

前言 本文用于記錄系統遷移中遇到的問題及解決方法&#xff0c;如有不對請指出&#xff0c;謝謝&#xff01; 現象 使用DiskGenius進行系統遷移后&#xff0c;使用USB啟動失敗&#xff0c;反復在品牌logo和黑屏之間切換&#xff0c;期間還會在左上角顯示”reset system“報錯…

使用 Postman 進行 API 測試:從入門到精通

使用 Postman 進行 API 測試&#xff1a;從入門到精通 使用 Postman 進行 API 測試&#xff1a;從入門到精通一、什么是 API 測試&#xff1f;二、Postman 簡介三、環境搭建四、API 測試流程1. 收集 API 文檔2. 發送基本請求示例&#xff1a;發送 GET 請求示例代碼&#xff08;…

Android Studio:Application 和 Activity的區別

Application 和 Activity 是 Android 中非常重要的兩個組件&#xff0c;它們分別負責不同的生命周期管理和應用的不同層次的操作。 Application 是應用級別的生命周期管理&#xff0c;它在整個應用運行時只有一個實例&#xff0c;負責應用的全局初始化和資源管理。Activity 是…

Mac本地體驗LM studio

博主很懶&#xff0c;不愛打字&#xff01; 1、LM studio官網&#xff1a;LM Studio - Discover, download, and run local LLMs 2、下載DMG文件&#xff0c;安裝 3、使用vscode工具&#xff0c;commandshiftH【全局替換功能】&#xff0c;選擇目錄/Applications/LM\ Studio…

SQL Server 數據庫備份指南

SQL Server備份是數據庫維護的日常工作。備份的目的是在發生數據丟失、損壞甚至硬件故障時將數據庫和事務日志恢復到最近的時間點。您可以借助專業的SQL Server備份軟件,操作起來更方便。前提需要安裝SQL Server Management Studio (SSMS)工具。 對于 SQL 數據庫備份,有多種…

我最近在干什么【2】

前言 這系列的上一篇是2024.12.05寫的&#xff0c;現在是2025.02.06&#xff0c;這都兩個月&#x1f914;小久。 不是完整全面的技術分享&#xff0c;話題聚焦個人成長&#xff08;學的技術、了解到的信息、看的書……&#xff09; 方面。文章偏意識流點&#xff0c;單純分享我…

Temperature、Top-P、Top-K、Frequency Penalty詳解

在生成式AI&#xff08;比如ChatGPT&#xff09;中&#xff0c;Temperature、Top-P、Top-K、Frequency Penalty 這些參數用于控制文本生成的多樣性、隨機性和重復度&#xff0c;它們的作用如下&#xff1a; 1. Temperature&#xff08;溫度&#xff09; 作用&#xff1a;控制輸…

4. Go結構體使用

1、結構體的簡介 結構體&#xff08;Struct&#xff09;是編程語言中常見的一種復合數據類型&#xff0c;它將不同類型的數據元素&#xff08;成員&#xff09;組合成一個單一的實體。通過結構體&#xff0c;程序員可以將具有不同類型和性質的信息綁定到一個對象中&#xff0c…

sqlite 查看表結構

在SQLite中&#xff0c;查看表結構通常有以下幾種方法&#xff1a; 使用.schema命令 在SQLite的命令行界面中&#xff0c;你可以使用.schema命令加上表名來查看該表的結構。例如&#xff0c;如果你想查看名為your_table_name的表結構&#xff0c;你可以這樣做&#xff1a; .s…

SpringAI介紹及本地模型使用方法

博客原文地址 前言 Spring在Java語言中一直穩居高位&#xff0c;與AI的洪流碰撞后也產生了一些有趣的”化學反應“&#xff0c;當然你要非要說碰撞屬于物理反應也可以&#xff0c; 在經歷了一系列復雜的反應方程后&#xff0c;Spring家族的新成員——SpringAI&#xff0c;就…

ip地址是手機號地址還是手機地址

在數字化生活的浪潮中&#xff0c;IP地址、手機號和手機地址這三個概念如影隨形&#xff0c;它們各自承載著網絡世界的獨特功能&#xff0c;卻又因名稱和功能的相似性而時常被混淆。尤其是“IP地址”這一術語&#xff0c;經常被錯誤地與手機號地址或手機地址劃上等號。本文旨在…

車載以太網__傳輸層

車載以太網中&#xff0c;傳輸層和實際用的互聯網相差無幾。本篇文章對傳輸層中的IP進行介紹 目錄 什么是IP&#xff1f; IP和MAC的關系 IP地址分類 私有IP NAT DHCP 為什么要防火墻穿透&#xff1f; 廣播 本地廣播 直接廣播 本地廣播VS直接廣播 組播 …

Docker 數據卷(Volume)詳細介紹

Docker 數據卷&#xff08;Volume&#xff09;詳細介紹 1. 什么是 Docker 數據卷&#xff1f; Docker 數據卷&#xff08;Volume&#xff09;是一種用于 持久化數據 和 容器間數據共享 的機制。由于容器的存儲是臨時的&#xff0c;容器刪除后其中的數據會丟失&#xff0c;因此…

wxWidgets生成HTML文件,帶圖片轉base64數據

編譯環境大家可以看我之前的文章,CodeBlocks + msys2 + wx3.2,win10 這里功能就是生成HTML文件,沒用HTML庫,因為是自己固定的格式,圖片是一個vector,可以動態改變數量的。 效果如下: #include <wx/string.h> #include <wx/file.h> #include <wx/ima…

網絡原理一>數據鏈路層協議->以太網協議

目錄 以太網協議的結構&#xff1a;類型&#xff1a;ARP請求應答報文&#xff1a;CRC&#xff1a;MTU: 為什么需要mac地址&#xff1a;mac地址和IP地址的區別&#xff1a; 以太網協議的結構&#xff1a; 以太網是數據鏈路層和物理層的主要協議 源IP&#xff0c;目的IP就不多說…

瘋狂SQL轉換系列- SQL for Milvs2.4

鑒于Milvus仍在不停的迭代新版本&#xff0c;推出新功能&#xff0c;其SDK目前并不穩定。目前其2.4版本的SDK接口已與之前的2.2版本有了較大的差別&#xff0c;功能上也有了一定的調整。為此&#xff0c;我們重新提供了針對[Milvus2.4](https://github.com/colorknight/moql-tr…

售后板子HDMI無輸出分析

問題&#xff1a; 某產品售后有1例HDMI無輸出。 分析&#xff1a; 1、測試HDMI的HPD腳&#xff08;HDMI座子的19pin&#xff09;&#xff0c;測試電壓4.5V&#xff0c;屬于正常。 2、用萬用表直流電壓檔&#xff0c;測試HDMI的3對數據腳和1對時鐘腳&#xff08;板子通過HDM…

【聲音轉文字CapsWriter】聲音隨時轉化為文字,CapsWriter提高工作效率

文章目錄 前言1. 軟件與模型下載2. 本地使用測試3. 異地遠程使用3.1 內網穿透工具下載安裝3.2 配置公網地址3.3 修改config文件3.4 異地遠程訪問服務端 4. 配置固定公網地址4.1 修改config文件 5. 固定tcp公網地址遠程訪問服務端 前言 今天我要給大家安利一個神器——CapsWrit…