Linux學習--C語言(指針3)

1.指針函數和函數指針

1.1 指針函數

指針函數是函數,函數的返回值是指針

  • 不能返回局部變量的地址
  • 指針函數返回的地址可以作為下一個函數調用的參數

?1.2 函數指針

函數指針是指針,指針指向一個函數

#include <stdio.h>int Add(int x, int y)
{return x + y;
}int Sub(int x, int y)
{return x - y;
}int Mul(int x, int y)
{return x * y;
}int Div(int x, int y)
{return x / y;
}int jisuanqi(int x, int y, int (*p)(int x, int y))
{return p(x,y);
}int main(void)
{int (*p)(int x, int y) = NULL;int num1 = 0;int num2 = 0;char op = 0;scanf("%d %c%d",&num1,&op,&num2);switch(op){case '+':p = Add;break;case '-':p = Sub;break;case '*':p = Mul;break;case '/':p = Div;break;}printf("Ret = %d\n",jisuanqi(num1, num2, p));    //p指向某函數return 0;
}

2.二級指針

2.1 定義

二級指針是指向一級指針變量的指針

int **q;定義一個指針變量q,占8個字節空間,指向ige指針變量空間,即指向一級指針變量的指針

2.2 使用場景

1.函數體內部想修改函數體外部指針變量的值時,需要傳遞指針變量的地址即二級指針

2.指針數組傳參,數組的數組名是指向數組第一個元素的指針,第一個元素是指針,所以數組名為指向指針的指針即二級指針

3.指針數組和數組指針

3.1 定義

1.指針數組:是數組,數組的每個元素是指針

2.數組指針:是指針,指針指向整個數組

int *a[5];
定義一個數組,占40個字節空間,數組名為a,每個元素都是int *型的指針int (*a)[5];
定義一個指針,占8個字節,指針變量名為a,是指向數組為20個字節空間的指針

3.2 指針數組

int *a[5];
char *pstr[5];
  • 存放字符串使用字符型數組,操作字符串使用指針
  • 存放字符串數組使用字符型二維數組,操作字符串數組使用指針數組

3.3 利用指針數組操作二維數組中的字符串實現排序

  • 二維數組存放字符串數組
  • 指針數組元素變化代替二維數組字符串變化,提高程序效率

?

3.4 數組指針

  • 對一維數組數組名&:值不變 ,類型升級為指向整個數組的指針
  • 對指針數組*:值不變,類型降級為指向數組第一個元素的指針
int a[5] = {1,2,3,4,5};a == &a[0];a == int *

注意:兩種情況a不能理解為int *

  • sizeof:獲得數據類型、變量所占字節
  • &:&int * -> int **? ?&a -> int (*p)[5]

?第十一行:&a+1指向下一個數組的首地址,再強制轉換為int *型,再減一即減去四個字節,回到數組a的第五個元素,故打印出來為5

?3.5 數組指針的使用場景

?1.一維數組和指針的關系

  • 數組的數組名是指向數組第一個元素的指針常量
int a[5] = {1,2,3,4,5};
int *p = NULL;p = &a[0];
p = a;a == &a[0];a[n] == *(a+n) == *(p+n) == p[n]

2.二維數組和指針的關系

  • 數組的數組名是指向數組第一行的數組指針
int a[2][3] = {1,2,3,4,5,6};
int *p = NULL;
int (*q)[3] = NULL;p = &a[0][0];
p = a[0];
p = *a;
q = a;a:指向數組第一行元素的數組指針    int (*)[3]
a[0]:指向a[0][0]的指針           int *
a[1]:指向a[1][0]的指針           int *訪問數組第m行第n列元素的方式:
a[m][n]
*(a[m]+n)
*(*(a+m)+n)
*(p+m*N+n)
*(*(q+m)+n)
*(q[m]+n)
q[m][n]

作業

1.封裝一個函數,將字符串“12345”轉換成整形12345

2.封裝函數實現mystrlen,mystrcpy,mystrcat,mystrcmp功能

3.從終端接收五個字符串,對他們排序后輸出

#include <stdio.h>int ToNum(char *a)
{int i = 0;int num[32] = {0};int sum = 0;while(*a != '\0'){num[i] = *a - '0';sum = sum * 10 + num[i];i++;a++;}return sum;
}int main(void)
{char a[32] = "12345";printf("outnum = %d\n",ToNum(a));return 0;
}
#include <stdio.h>int mystrlen(const char *str)
{int i = 0;while(*str != '\0'){str++;i++;}return i;
}char *mystrcpy(const char *pstr, char *pret)
{char *ret = pret;while(*pstr != '\0'){*pret = *pstr;pret++;pstr++;}return ret;
}int mystrcmp(const char *pstr, const char *pdst)
{while(*pstr == *pdst){if(*pstr == '\0'){return 0;}pstr++;pdst++;}return *pstr - *pdst;
}char *mystrcat(char *pstr, const char *pdst)
{int len = mystrlen(pstr);char *str = pstr;pstr += len;while(*pdst != '\0'){*pstr = *pdst;pstr++;pdst++;}return str;
}int main(void)
{char str[100] = {0};char dst[100] = {0};char ret[100] = {0};gets(str);gets(dst);printf("strlen:len_str = %d\n",mystrlen(str));printf("strcpy:ret_cpy_str = %s\n",mystrcpy(str,ret));if(mystrcmp(str,dst) > 0){printf("str > cmp\n");}else if(mystrcmp(str,dst) == 0){printf("str = dst\n");}else{printf("str < dst\n");}printf("strcat:new_str = %s\n",mystrcat(str,dst));return 0;
}
#include <stdio.h>
#include <string.h>int main(void)
{char a[5][100] = {0};char *pstr[5] = {a[0], a[1], a[2], a[3], a[4]};char tmp[100] = {0};int i = 0;int j = 0;for(i = 0; i < 5; i++){gets(a[i]);}for(j = 0; j < 4; j++){for(i = 0; i < 4-j; i++){if(strcmp(pstr[i], pstr[i+1]) > 0){strcpy(tmp,pstr[i]);strcpy(pstr[i], pstr[i+1]);strcpy(pstr[i+1], tmp);}}}for(i = 0; i < 5; i++){printf("a[%d] = %s\n",i,a[i]);}return 0;
}

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

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

相關文章

【JAVA EE初階】多線程(上)

目錄 1.預備知識 1.1 馮諾依曼體系結構&#xff1a; 1.2 現代CPU主要關心指標&#xff08;和日常開發密切相關的&#xff09; 1.3 計算機中&#xff0c;一個漢字占幾個字節&#xff1f; 1.4 Windows和Linux的區別 1.5 PCB的一些關鍵要點 2.線程和進程 2.1 創建線程的寫法…

用互聯網思維擴展電商后臺的 CRUD 功能

一、自定義實現MyBatis-Plus逆向工程 多數據源的問題解決了&#xff0c;接下來開始進行實際開發時&#xff0c;你會發現&#xff0c;最麻煩的一件事情就是要創建與數據庫表對應的POJO了。這些沒什么難度&#xff0c;但是繁瑣的內容會占據大量的開發時間。比如一個PmsProducr對…

無代碼測試平臺ATECLOUD全場景測試方案

ATECLOUD 智能云測試平臺是有納米軟件開發的一款以無代碼架構與彈性擴展體系為核心的自動化測試平臺&#xff0c;通過數據模型驅動的創新設計&#xff0c;為研發、產線等多場景提供高效可控的測試解決方案。?無代碼架構 ATECLOUD 打破傳統技術壁壘&#xff0c;構建完全可視化的…

當 AI 重構審計流程,CISA 認證為何成為破局關鍵

在南京審計大學最新發布的《面向審計行業 DeepSeek 大模型操作指南》中&#xff0c;一組數據引發行業深思&#xff1a;通過自動化數據處理、智能風險識別和定制化報告生成&#xff0c;AI 大模型能幫助審計人員降低 40% 以上的人工成本&#xff0c;同時將風險識別準確率提升至 9…

NAT技術、代理服務器

NAT/NAPT技術NAT的全稱是network address translation&#xff0c;網絡地址轉換。NAT 能在對外通信時夠將源 IP 轉為新源 IP&#xff0c;對內通信時將目的ip轉換成新目的ip&#xff0c;實現這個操作&#xff0c;靠的是地址轉換表但NAT的說法其實是不準確的&#xff0c;因為多個…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-45,(知識點:負反饋的作用,基礎理解,干擾和噪聲的抑制)

目錄 1、題目 2、解答 步驟一&#xff1a;明確負反饋的作用原理 步驟二&#xff1a;逐一分析選項 3、相關知識點 一、負反饋的基本原理 二、負反饋對干擾和噪聲的抑制機制 三、選項分析與答案 四、擴展思考&#xff1a;如何抑制不同位置的干擾&#xff1f; 總結 題目…

Flutter藍牙BLE開發完全指南(內含高級功能擴展)

Flutter藍牙BLE開發完全指南 我將為您提供一個完整的Flutter藍牙BLE實現方案,包含UI設計、權限處理、設備掃描、連接通信等完整功能。 完整實現方案 1. 添加依賴與權限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 標簽加載并渲染視頻

在部分瀏覽器環境或業務場景下&#xff0c;直接使用 <video> 標簽加載視頻會出現首幀延遲的情況。以下方法通過 WebGPU Canvas 2D 將視頻幀繪制到自定義 Canvas 上&#xff0c;讓 <video> 只做解碼&#xff0c;WebGPU 接管渲染&#xff0c;通過最小化對象創建 精…

基于Flask的智能停車場管理系統開發實踐

在現代城市中&#xff0c;停車難已成為一個普遍問題。為了解決這一問題&#xff0c;我開發了一個基于Python Flask框架的智能停車場管理系統。該系統集成了車牌識別、車位狀態監控、收費管理等多項功能&#xff0c;為停車場的智能化管理提供了完整的解決方案。系統功能概述該停…

【C#獲取高精度時間】

在C#中&#xff0c;有幾種方法可以獲取高精度時間&#xff08;高分辨率時間戳&#xff09;&#xff0c;適用于性能測量、計時等需要高精度的場景。以下是幾種常用方法&#xff1a; 1. 使用 Stopwatch 類&#xff08;推薦&#xff09; Stopwatch 類提供了最高精度的時間測量&…

Spring Boot + React 打造現代化高校成績管理系統實戰記錄

作者: 笙囧同學 發布時間: 2025年7月 技術棧: Spring Boot 3.2.3 React 18 TypeScript 華為云GaussDB 項目類型: 全棧Web應用 開發周期: 30天 代碼量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同學&#xff01;&#x1f64b;?♂? 作為一名計算機科學與技…

形參表不匹配(BUG)

在您的代碼中&#xff0c;存在兩個主要問題導致"形參表中不匹配"的錯誤&#xff1a;erase() 函數中的成員變量名錯誤iterator erase(iterator pos) {// ...size--; // ? 錯誤&#xff1a;成員變量名為 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循環依賴以及三個級別緩存

Spring循環依賴以及三個級別緩存 什么是循環依賴&#xff1f; 循環依賴&#xff0c;顧名思義&#xff0c;就是指兩個或多個 Spring Bean 之間相互依賴&#xff0c;形成一個閉環。 最常見也是 Spring 能夠“解決”的循環依賴是構造器注入 和 setter 注入 混合或單獨使用時&…

《零基礎入門AI:OpenCV圖像預處理進一步學習》

本文全面講解OpenCV圖像預處理的七大核心技術&#xff08;插值方法、邊緣填充、圖像矯正&#xff08;透視變換&#xff09;、圖像掩膜、ROI切割、圖像添加水印、圖像噪點消除&#xff09;&#xff0c;每個知識點都配有詳細解釋和實用代碼示例&#xff0c;幫助初學者建立系統的圖…

MongoDB的內存和核心數對于運行效率的影響

在 MongoDB 線上生產環境中&#xff0c;CPU&#xff08;核心&#xff09; 和 內存 是兩大關鍵硬件資源&#xff0c;它們在不同的操作場景下發揮著核心作用&#xff0c;共同影響著數據庫的性能、穩定性和擴展性。理解它們的作用場景至關重要&#xff0c;是容量規劃、性能優化和故…

自己的SAPGUI嘗試

為滿足用戶需求&#xff0c;博主做了一個臺賬管理程序&#xff0c;嘗試用自己的程序做GUI&#xff0c;用SAP 系統做數據庫。 運行了半年&#xff0c;程序很nice,用戶每天都在高效的使用&#xff0c;已經有十幾萬的數據。 總結一下這次自己的GUI嘗試&#xff0c;好處是C# WINFOR…

高效處理 JSON 數據:JsonUtil 工具類全方位解析與實戰

在現代軟件開發中,JSON(JavaScript Object Notation)已成為數據交換的“通用語言”——從前后端接口通信到微服務數據交互,從配置文件解析到日志格式化,幾乎所有場景都離不開JSON的處理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重復代碼,且空指針、…

Python 庫手冊:xmlrpc.client 與 xmlrpc.server 模塊

xmlrpc.client 和 xmlrpc.server 是 Python 標準庫中用于構建基于 XML-RPC 協議的遠程過程調用&#xff08;RPC&#xff09;通信模塊。xmlrpc.client 用于編寫客戶端程序&#xff0c;向遠程服務器發起方法調用。xmlrpc.server 用于編寫服務器端&#xff0c;暴露本地方法供遠程客…

渲染篇(一):從零實現一個“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;從零實現一個“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之問” 在前面兩章中&#xff0c;我們已經奠定了堅實的架構基礎。我們用“任務調度器”建立了聲明式和模塊化的編程范式&#xff0c;并通過對比MVC等模式論…

SWC 深入全面講解

一、核心功能與原理 1. 高性能編譯 Rust 架構優勢&#xff1a;SWC 基于 Rust 編寫&#xff0c;利用 Rust 的性能和并發性優勢&#xff0c;編譯速度比 Babel 快約 20 倍&#xff0c;比 TypeScript 編譯器更快。并行編譯&#xff1a;支持多線程并行處理&#xff0c;在四核基準測試…