C語言---萬能指針(void *)、查找子串(strncmp函數的應用)多維數組(一維數組指針、二維數組指針)、返回指針值函數、關鍵字(const)

一、字符串與指針

? ? ? ? 用字符指針指向一個字符串,可以不定義字符數組,而定義字符指針。用字符指針指向字符串中的字符。不能使用指針去改變不能修改的空間。

eg1. 運用指針將 src 的內容拷貝到 dest 中去

?

void Strcpy(char *dest, char *src)
{while(*src != '\0'){*dest = *src;++dest;++src;}*dest = '\0';
}

eg2. 運用指針將 src 的內容剪切到 dest 后面

void Strcat(char *dest, const char *src)
{while(*dest){*dest = *dest;++dest;}while(*src){*dest = *src;++dest;++src;}*dest = '\0';
}

eg3. 運用指針比較 s1 與 s2 的大小

int Strcmp(const char *s1, const char *s2)
{while(*s1 == *s2 && *s1 != '\0' && *s2 != '\0') {++s1;++s2;}return *s1 - *s2; 
}

eg4.?運用指針將 src 的前 n 個字符拷貝到 dest 中去

//將src的前n個字符拷給dest中去
void Strncpy(char *dest, const char *src,int n)
{while(*src != '\0' && n-- != 0 ){*dest = *src;++dest;++src;}//*dest = '\0';
}

eg5. 運用指針將 src 前 n 個字符連接到 dest 的后面去

void Strncat(char *dest, const char *src, int n)
{while(*dest){++dest;}while(*src && n--){*dest++ = *src++;}*dest = 0;
}

eg6. 運用指針只比較 s1 與 s2 的前 n 個字節的大小(可用于查找子串)

int Strncmp(const char *s1, const char *s2, int n)
{while(--n && *s1 == *s2 && *s1 && *s2)// --n{++s1;++s2;}return *s1 - *s2;
}

上述函數在主函數中的運行格式:

int main(void)
{char s1[100] = "Hello ";char s2[100] = "Herld!";Strcpy(s2, s1);Strcat(s1,s2);//Strcat(s1, "World");Strncpy(s1, s2, 2);Strncat(s1, s2, 2);//puts(s1);int t = Strncmp(s1, s2, 2);printf("%d\n", t);return 0;
}

二、萬能指針(空指針)

? ? ? ? 萬能指針可以用來接收任何數據類型的指針,當多個函數的運行程序段一致,但函數形參類型不一致時,可用萬能指針結合強制類型轉換符進行合并。

????????例如,只將?src 空指針型數組中的前 n 個數據拷貝到 dest 空指針型數組中去(適用于任何數據類型的拷貝)

//萬能指針
void Memcpy(void *dest, const void *src, int n)
{char *q = (char *)dest;char *p = (char *)src;while(n--){*q++ = *p++;}
}
int main(void)
{short a[10] = {1,2,3,4,5,6,7,8,9,0};short b[10];int len = sizeof(a) / sizeof(*a);Memcpy(b, a, sizeof(a));int i;for(i = 0; i < len; ++i){printf("%d\n", b[i]);}return 0;
}

三、查找子串

? ? ? ? 運用?Strncmp 函數查找 sub 在 s?中首次出現的位置

int subString(const char *s, const char *sub)
{int i;//printf("%d\n",strlen(s));for(i = 0; i <= strlen(s) - strlen(sub); ++i){if(strncmp(s + i, sub, strlen(sub)) == 0){break;}        }if(i > strlen(s) - strlen(sub)){return 0;}else{return i;}
}
int main(void)
{char *sub = "hand";char *s = "He is handsome";int ret = subString(s, sub);if(ret != 0){printf("found\n");printf("在s[%d]\n", subString(s, sub));}else{printf("not found\n");}return 0;
}

四、一維數組指針

? ? ? ? 一維數組指針也稱為指向一維數組元素的指針,本質是一個指針變量。

????????一般形式:數據類型 (*標識符)[一維數組長度]

例如:int (*p)[10]:長度為10的一維整型數組,對指針 p 加?n 表示: 偏移 n*sizeof(基類型) 個字節。

五、二維數組指針

? ? ? ?1、概念

???????? 二維數組指針也稱為指向二維數組的指針或數組指針,其作為函數參數傳遞的媒介,形參是指向一維數組的指針,是一種特殊的指針類型,用于指向二維數組的整體或其行、元素,實現靈活的數組訪問和傳遞。

? ? ? ? (1) 指向二維數組的行(以下皆用 p 當作二維數組 a[][4] 的指針)

? ? ? ? ? ? ? ? int (*p)[4]=a? <=等價于=> a[0]

? ? ? ? (2) 指向二位數組的 i 行 j 列

? ? ? ? ? ? ? ? *(*( a+ i) + j)? <=等價于=> a[i][j]

? ? ? ? ? ? ? ? 例如:*(*(a + 1) + 1)? <=表示=> 二維數組中 a[1][1] 的值

? ? ? ? 2、二維數組指針的輸出

void printArray2D(int (*a)[4], int rows)
{int i, j;int cols = sizeof(*a) / sizeof(**a);for(i = 0; i < rows; ++i){for(j = 0; j < cols; ++j){printf("%2d ", *(*(a+i)+j));}puts("");}
}

? ? ? ? 3、二維數組指針的求和

int sumArray2D(int (*a)[4], int rows)
{int i, j;int sum = 0;int cols = sizeof(*a) / sizeof(**a);for(i = 0; i < rows; ++i){for(j = 0; j < cols; ++j){sum += *(*(a + i) + j);}}return sum;
}

????????4、二維數組指針的水平鏡像

//a與b的交換
void swap(int *a, int *b)
{int t;t = *a;*a = *b;*b = t;
}
//一維數組的逆序
void reverse(int *begin, int *end)
{while(begin < end){swap(begin++, end--);}
}
//二維數組的水平鏡像
void reverse2D(int (*a)[4], int rows)
{int i, j;int cols = sizeof(*a) / sizeof(**a);for(i = 0; i < rows; ++i){reverse(*(a + i), *(a + i) + (cols -1));}
}

上述函數在主函數中的使用格式:

int main(void)
{int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int rows = sizeof(a) / sizeof(*a);int t = sumArray2D(a, rows);printArray2D(a, rows);//printf("%d\n", t);reverse2D(a, rows);printArray2D(a, rows);return 0;
}

可以運用強制類型轉換符改變指針輸出類型,例如:

? ? ? ? printf("%d\n", *( (int *)(p + 3) - 5) ),對于三行四列的二維數組a[3][4],該輸出指向 a[1][3] 中的值。

六、返回指針值的函數

? ? ? ? 一般定義形式:類型名 *函數名(參數列表)

? ? ? ? 返回指針值的函數稱為指針函數。一個函數可以返回一個整型值、字符值、實型值等,也可以返回指針型的數據,即地址。可應用到多種函數的創建中去,例如字符型數組的拷貝(eg1. )、字符型數組的剪切(eg2.)。

eg1. 將 src 字符串的內容拷貝到 dest 字符串中去,要求函數須有返回值,并在輸出時直接打印出結果

char *Strcpy(char *dest, const char *src)
{char *ret = dest;while(*src){*dest++ = *src++;}*dest = '\0';return ret;
}

eg2. 將 src 字符串的內容粘貼到 dest 字符串的后面,要求函數須有返回值,并且輸出時直接打印出結果

char *Strcat(char *dest, const char *src)
{char *ret = dest;while(*dest){++dest;}while(*src){*dest = *src;++dest;++src;}return ret;
}

以上函數在主函數中的運行的書寫格式?

該類函數不能返回局部變量的值,例如:

static int i;
return &i;
*foo(&i) = 100; // * 為取地址

需要在變量 i 前加上 static ,讓其存儲與靜態區(全局區)。

七、關鍵字 const

? ? ? ? 在指針前加 const 表示無法通過該指針去修改它所指向的變量,但指針本身可以指向其他地址。可以提高代碼可讀性和函數的傳參效率。常用于不能修改的字符指針前。例如:

int a = 10;
int b = 20;
const int *p = &a;

若執行" *p = 20 ",會編譯錯誤,不能通過 p 修改所指向的值;

若執行“ p = &b?”,可以執行,指針 p 可以指向其他地址。

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

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

相關文章

Keepalived 實戰

一、高可用集群基礎核心概念與指標集群類型&#xff1a;LB&#xff08;負載均衡&#xff09;&#xff1a;如 LVS、HAProxy、Nginx&#xff0c;提升吞吐量&#xff1b;HA&#xff08;高可用&#xff09;&#xff1a;保障核心服務&#xff08;數據庫、Redis&#xff09;連續性&am…

窗口函數替代子查詢的復雜查詢簡化技巧

窗口函數通過單次掃描完成分析計算&#xff0c;能大幅簡化子查詢結構并提升性能&#xff0c;尤其在排名、累計計算等場景?15。以下是核心優化技巧&#xff1a;一、排名場景替代方案?部門工資排名?傳統子查詢需自連接和聚合計數&#xff1a;sqlSELECT e1.name, e1.salary, (S…

深度學習:預訓練和warm up的區別

“預訓練&#xff08;Pre-training&#xff09;”和“Warm-up&#xff08;預熱&#xff09;”是深度學習中常見的兩個訓練策略&#xff0c;它們雖然都在訓練初期起作用&#xff0c;但本質和目的完全不同。一、預訓練&#xff08;Pre-training&#xff09;1. 定義預訓練是指&…

Apache Ignite中分布式信號量(Distributed Semaphore)的說明和使用示例

這段內容是關于 Apache Ignite 中 分布式信號量&#xff08;Distributed Semaphore&#xff09; 的說明和使用示例。我們來一步步解析&#xff0c;幫助你深入理解它的含義和用途。&#x1f539; 一、什么是 Semaphore&#xff08;信號量&#xff09;&#xff1f; 在并發編程中&…

怎么提升服務器的防攻擊能力!

提升服務器的防攻擊能力需要從??架構設計、技術防護、運維管理??等多維度入手&#xff0c;覆蓋網絡層、系統層、應用層及數據層的安全防護。以下是具體的策略和實踐方法&#xff1a;??一、基礎安全加固&#xff1a;消除自身漏洞??服務器自身的脆弱性是最常見的攻擊入口…

vscode配置rust環境

1.官網下載vscode&#xff0c;安裝 2.vscode命令行運行&#xff1a; Invoke-WebRequest https://win.rustup.rs/x86_64 -OutFile rustup-init.exe然后&#xff1a; .\rustup-init.exe3.驗證 先配置path&#xff1a; $env:Path ";$env:USERPROFILE\.cargo\bin"查看是…

最新版 HarmonyOS NEXT 開發工具安裝教程:如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器?

最新版 HarmonyOS NEXT 開發工具安裝教程&#xff1a;如何在 macOS 系統安裝 DevEco Studio 5.0.3 編輯器&#xff1f; 什么是 DevEco Studio&#xff1f; DevEco Studio 是華為為 HarmonyOS 開發的強大集成開發環境&#xff08;IDE&#xff09;&#xff0c;專為開發 Harmony…

電商項目統一認證方案設計與實戰

1. 微服務網關整合 OAuth2.0 設計思路分析 網關整合 OAuth2.0 有兩種思路&#xff0c;一種是授權服務器生成令牌, 所有請求統一 在網關層驗證&#xff0c;判斷權限等操作&#xff1b;另一種是由各資源服務處理&#xff0c;網關只做請求 轉發 。 比較常用的是第一種&#xf…

學習Markdown

標題一 標題二 標題三 標題四 標題五 標題六這是一段引用文本直接編寫&#xff0c;段落換行是末尾兩個以上的空格&#xff0b;回車 或者在段落后加一個空行 粗體語法&#xff1a;使用兩個星號 ** 或兩個下劃線 __ 包圍文字&#xff1a;這是粗體文字使用星號 這是__粗體文字__使…

劇本殺系統 App 開發:科技賦能,重塑劇本殺游戲體驗

在科技飛速發展的當下&#xff0c;各個行業都在積極尋求與科技的融合&#xff0c;以實現創新和升級。劇本殺行業也不例外&#xff0c;劇本殺系統 App 的開發正是科技賦能的生動體現&#xff0c;它重塑了傳統的劇本殺游戲體驗&#xff0c;為玩家帶來了全新的感受。劇本殺系統 Ap…

wvp-gb28181-pro 只用jar運行

編譯前端后npm install --global yarnyarn --registryhttps://registry.npmjs.org installyarn run build&#xff0c;生成的前端文件&#xff0c;會在wvp-GB28181-pro\src\main\resources\static&#xff0c;因為是在resources中&#xff0c;打maven打包后會一起打到jar中&…

深度學習(魚書)day06--神經網絡的學習(后兩節)

深度學習&#xff08;魚書&#xff09;day06–神經網絡的學習&#xff08;后兩節&#xff09;一、梯度 像 這樣的由全部變量的偏導數匯總而成的向量稱為梯度&#xff08;gradient&#xff09;。 梯度實現的代碼&#xff1a; def numerical_gradient(f, x):h 1e-4 # 0.0001grad…

學習嵌入式的第三十四天-數據結構-(2025.7.29)數據庫

數據庫基礎概念 數據庫是用于存儲和管理海量數據的應用程序&#xff0c;提供數據增刪改查及統計功能&#xff08;如最大值、最小值、平均數等&#xff09;。通過SQL語句操作數據&#xff0c;以表格形式管理存儲。 數據庫分類 關系型數據庫 Oracle&#xff08;大型&#xff0…

STM32——HAL庫

總&#xff1a;STM32——學習總綱 一、簡介 1.1 CMIS簡介 所有廠家為了市場兼容性推出的標準 arm架構 1.2 HAL庫簡介 1.2.1 各種庫優缺點 二、 STM32 Cube固件包 ST公司為CMSIS 中間層開發的pack&#xff0c;包含HAL。 2.1 獲取方式 ST官網&#xff1a;st.com/content/st_c…

數據結構-圖的相關定義

圖-多對多Graph&#xff08;V,E&#xff09;&#xff0c;圖&#xff08;頂點Vertex&#xff0c;邊Edge&#xff09;圖可以沒有邊&#xff0c;只有一個頂點也叫圖&#xff0c;但是單獨的一條邊&#xff0c;或者一個頂點連一條邊&#xff0c;不能叫圖有向圖&#xff1a;無向圖&am…

B 站搜一搜關鍵詞優化:精準觸達用戶的流量密碼

在 B 站內容生態中&#xff0c;搜一搜功能是用戶主動獲取信息的重要渠道&#xff0c;而關鍵詞優化則是讓你的視頻在搜索結果中脫穎而出的關鍵。通過合理優化關鍵詞&#xff0c;能提升視頻曝光率&#xff0c;吸引精準流量&#xff0c;為賬號發展注入強勁動力。以下從關鍵詞挖掘、…

Python爬蟲實戰:研究purl庫相關技術

1. 引言 隨著互聯網數據量的爆炸式增長,網絡爬蟲已成為數據采集、輿情分析和學術研究的重要工具。Python 憑借其豐富的庫生態和簡潔語法,成為開發爬蟲的首選語言。本文提出的爬蟲系統結合 requests 進行 HTTP 請求、BeautifulSoup 解析 HTML,并創新性地引入 purl 庫處理復雜…

OpenCV 學習探秘之三:從圖像讀取到特征識別,再到機器學習等函數接口的全面實戰應用與解析

一、引言 1.1介紹 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個功能強大的開源計算機視覺庫&#xff0c;廣泛應用于圖像和視頻處理、目標檢測、機器學習等領域。本文將全面解析 OpenCV 中常用的函數接口&#xff0c;幫助讀者快速掌握 OpenCV 的…

Umi從零搭建Ant Design Pro項目(3)集成 openapi 插件

1. 安裝插件 pnpm add umijs/max-plugin-openapi pnpm add swagger-ui-dist如果不安裝swagger-ui-dist&#xff0c;不會影響運行。但會報錯。 2.配置文件export default defineConfig({// umi插件配置plugins: [umijs/max-plugin-openapi],// openAPI配置openAPI: {requestLibP…

Flutter開發實戰之狀態管理深入解析

第4章:狀態管理深入解析 前言 想象一下,你正在開發一個購物車應用。用戶在商品頁面添加商品,然后去購物車頁面查看,最后到結算頁面付款。在這個過程中,購物車的數據需要在多個頁面之間保持同步和一致。這就是狀態管理要解決的核心問題。 狀態管理是Flutter開發中最重要…