C語言 —— 指針(4)

動態內存分配

動態內存需要手動申請,手動歸還,其內存是開辟在堆區。

申請的函數為:

void *malloc(size_t? size) (需包含頭文件#include<stdlib.h>)

size:要分配的內存大小,以字節為單位。申請的空間是連續的,成功時返回指向內存分配的指針(類型為void * 型,通常需要進行強制類型轉換),失敗時返回空指針(NULL)。需手動管理內存,所分配的內存不會自動釋放,必須調用free()避免內存泄漏。返回的指針會適當對齊,適合任何數據類型。如:分配一個整型數組

#include<stdio.h>
#include<stdlib.h>int main(void)
{int n = 5;int *a = (int *)malloc(n * sizeof(int));if(a == NULL){printf("分配內存失敗\n");return 1;}int i = 0;for(i = 0; i < n; ++i){a[i] = i + 1;    }for(i = 0; i < n; ++i){printf("%d\n",a[i])}free(a);a = NULL;return 0;
}

釋放內存后未將指針置為NULL稱為懸空指針,可能導致非法訪問。

動態內存重新分配

形式:void *relloc(void *p,size_t? newsize);

參數p:指向之前分配的內存的指針

參數size:所需要新的內存大小

返回值指向新的內存,與原來的p指向的內存可能不同。

特點:數據保留,拷貝原來的內容到新的空間。

eg:如原來申請內存只能容納長度為10的一維整型數組,現在改為可容納長度為20的一維整形數組。

void printArray(int *a,int len)
{int i;for(i < 0 ;i < len;++i){printf("%2d ",*(a + i));}puts("");
}int main(void)
{int n = 10;int *p = malloc(n * sizeof(int));int i;for( i = 0;i < n;++i){*(p + i) = i + 1;}int m = 20;int *q = realloc(p, m * sizeof(int));p = q;for(i = 10;i < m; ++i){*(p + i) = i + 1;}free(p);p = q = NULL;printArray(p,m);return 0;
}

函數指針

它存儲的是函數的地址,而不是數據變量的地址。通過函數指針,可以動態的調用不同的函數,實現回調。

基本語法:

定義函數

int add(int a,int b)
{return a + b
}int sub(int a,int b)
{return a - b;
}

1、定義函數指針:? 返回值類型(*指針變量名)(參數列表)

如回調上述代碼:int (*pfn)(int , int);

2、初始化指針

pfn = &add;
或
pfn = add;

(函數名本身代表函數的入口地址)

即:

int add(int a,int b)
{return a + b
}int sub(int a,int b)
{return a - b;
}int(*pfn)(int,int) = add;

指針便指向了add函數(改為sub,便指向sub)

3、通過函數指針調用函數

int div3(int n)
{return n % 3 == 0;
}int div5(int n)
{return n % 5 == 0;
}int fn(int n)
{return 1;
}void printArray(int *a,int len,int(*pfn)(int))
{int i;for(i = 0;i < len; ++i){if(pfn(*(a + i))){printf("%2d ",*(a + i));}}puts("");}

主函數調用printArray傳參,最后一個傳入回調函數的函數名。

指針數組

指針數組是指一個數組,其元素都是指針,簡單地說,數組中的每一個元素存儲都是一個內存地址,而不是直接存儲數據。

當它作為函數參數,形參是指向指針的指針。

void printStrings(char **p,int len)
{int i;for(i = 0;i < len;++i){puts(p[i]);}
}void reverseStrings(char **p,int len)
{int i;for(i = 0;i < len / 2;++i){char *t;t = p[i];p[i] = p[len - i - 1];p[len - i - 1] = t;}
}char *maxStrings(char **p,int len)
{char *max = p[0];int i;for(i = 1;i < len; ++i){if(strcmp(max,p[i]) < 0){max = p[i];}}return max;
}void sortStrings(char **p,int len)
{int i,j;for(i = 0; i < len - 1;++i){for(j = i + 1;j < len; ++j){if(strcmp(p[i] , p[j]) > 0){char *t;t = p[i];p[i] = p[j];p[j] = t;}}}
}int main(void)
{char *s[3] = {"Hello","World!","China"};int len = sizeof(s) / sizeof(*s);//reverseStrings(s,len);//printStrings(s,len);//printf("%s\n",maxStrings(s,len));sortStrings(s,len);printStrings(s,len);return 0;
}

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

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

相關文章

常用算法思想及模板

今天繼續整理一些關于算法競賽中C適用的一些模板以及思想。 保留x位小數 保留x位小數在C語言中可以使用printf中的"%.xf"來實現&#xff0c;但是很多C選手由于關閉了同步流&#xff0c;害怕cin、cout與scanf、printf混用容易出錯&#xff0c;所以就給大家介紹一個強…

GitLab 倉庫 — 常用的 git 命令

在公司的 gitlab 公共倉庫中寫代碼做項目時&#xff0c;主要涉及以下常用 git 命令&#xff1a;一、單個命令講解1. 拉取代碼&#xff08;1&#xff09;git clone [倉庫 URL]?克隆遠程倉庫到本地&#xff08;需確保 URL 正確&#xff09; ?&#xff08;?2&#xff09;git pu…

【28】C# WinForm入門到精通 ——多文檔窗體MDI【屬性、方法、實例、源碼】【多窗口重疊、水平平鋪、垂直平鋪、窗體傳值】

文章目錄1多文檔窗體MDI2 基本設置3 實例&#xff1a;多窗口重疊、水平平鋪、垂直平鋪3.1 主窗口屬性設置3.2 主窗口3.3 主窗口窗口添加MenuStrip菜單3.4 添加處理函數3.5 測試效果4 利用窗體參數定義進行傳值4.1 在Form2、Form3添加相關控件4.2 Form3 定義函數public Form3(st…

【計算機科學與應用】基于Session欺騙攻擊的Web應用程序防護

導讀&#xff1a; 本文對Web應用程序開發中的Session欺騙攻擊進行了闡述&#xff0c;詳細講解了防范Session欺騙攻擊的三種傳統方法&#xff0c;并給出了防范代碼&#xff0c;分析了三種傳統防范方法的不足&#xff0c;新設計了一種通過Referer信息驗證來加強對Session欺騙的防…

yolo8+阿里千問圖片理解(華為簡易版小藝看世界)

? 實現目標 按下空格鍵 → 獲取攝像頭當前畫面&#xff1b; 將圖片上傳給 大模型 接口&#xff0c;讓其“看圖說話”&#xff1b; 獲取返回描述后&#xff0c;以字幕形式展示在圖像畫面上&#xff1b; 持續顯示識別結果&#xff0c;直到下次按空格。 &#x1f9e0; 需要準…

【ee類保研面試】數學類---線性代數

25保研er&#xff0c;希望將自己的面試復習分享出來&#xff0c;供大家參考 part0—英語類 part1—通信類 part2—信號類 part3—高數類 part100—self項目準備 文章目錄線性代數知識點大全**1. 余子式與代數余子式****2. 行列式的含義****3. 矩陣的秩&#xff08;Rank&#xf…

在 Scintilla 中為 Squirrel 語言設置語法解析器的方法

Scintilla 作為一個強大的開源文本編輯控件&#xff0c;通過配置語法解析器&#xff0c;能夠對多種編程語言實現語法高亮、代碼折疊等實用功能。若要為新語言 Squirrel 設置語法解析器&#xff0c;可參考以下步驟&#xff1a;?創建 Lexer 源文件&#xff1a;Scintilla 通過 Le…

Go語言核心知識點補充

Go語言核心知識點補充 make函數、for循環與輸入處理詳解 在前幾章的內容中&#xff0c;我們介紹了Go語言的基礎語法、變量聲明、切片、循環等核心概念。但在實際開發中&#xff0c;一些細節性的知識點往往決定了代碼的健壯性與效率。 本文將針對前幾章涉及到的變量聲明與初始化…

AI服務器中,EEPROM有哪些部件使用,需要存儲哪些信息?

在AI服務器中&#xff0c;EEPROM&#xff08;電可擦可編程只讀存儲器&#xff09;主要用于存儲關鍵組件的配置數據、身份信息和校準參數。以下是主要組件及其存儲內容&#xff1a; 一、核心組件及存儲數據主板&#xff08;Baseboard Management Controller, BMC&#xff09; FR…

It學習資源下載

一.UI 8個高質量UI設計網站&#xff0c;靈感收集必備&#xff01;

Docker Compose :從入門到企業級部署

Docker Compose &#xff1a;從入門到企業級部署1. Docker Compose 核心概念1.1 Compose 架構全景圖2. 完整開發工作流2.1 典型開發流程2.2 多服務示例項目結構3. 核心配置詳解3.1 服務配置矩陣3.2 網絡拓撲示例4. 企業級部署方案4.1 多環境配置管理4.2 擴展部署架構5. 高級技巧…

1.2.vue插值表達式

在 Vue.js 中&#xff0c;插值表達式是用于在模板中顯示數據的一種方式。它使用雙大括號語法 {{ }} 來包裹需要輸出的變量或表達式的值。Vue 會自動將這些表達式的值插入到 HTML 文檔中相應的位置。插值表達式基本用法最基本的插值表達式形式就是直接在模板中引用 Vue 實例中的…

Python數據處理基礎(學習筆記分享)

Python數據處理入門 常用庫學習 numpy NumPy&#xff08;Numerical Python&#xff09; 是 Python 中用于高效數值計算的庫&#xff0c;核心是提供一個強大的 ndarray?&#xff08;多維數組&#xff09;對象&#xff0c;類似于 C/C 中的數組&#xff0c;但支持更豐富的操作&a…

力扣面試150題--顛倒二進制位

Day 89 題目描述思路 二進制的算法&#xff0c;將十進制轉化為二進制&#xff0c;有一點需要注意&#xff0c;直接采取庫函數轉化為二進制再反轉會出現問題&#xff08;這也是為什么我要補0的原因&#xff09;&#xff0c;因為轉化過去不滿足32位的二進制&#xff0c;前面不會當…

【ResNet50圖像分類部署至RK3588】模型訓練→轉換RKNN→開發板部署

已在GitHub開源與本博客同步的ResNet50v2_RK3588_Classificationt項目&#xff0c;地址&#xff1a;https://github.com/A7bert777/ResNet50v2_RK3588_Classification 詳細使用教程&#xff0c;可參考README.md或參考本博客第八章 模型部署 文章目錄一、項目回顧二、模型選擇介…

C# _泛型

目錄 泛型是什么? 泛型的主要優勢 創建一個泛型類 泛型方法 泛型是什么? 泛型是通過參數化來實現同一份代碼上操作多種數據類型 利用參數類型將參數的類型抽象化 從而實現靈活的復用 總結: 通過泛型可以實現在同一份代碼上操作多種數據類型的邏輯 將類和類中的成員定義…

Vue路由鉤子完全指南

Vue.js中的路由導航鉤子&#xff08;Navigation Guards&#xff09;主要用于在路由導航過程中進行攔截和處理&#xff0c;確保訪問控制和狀態管理。以下是主要分類及使用方法&#xff1a; 1. 全局鉤子函數 作用于整個路由實例&#xff0c;需在路由配置外定義&#xff1a; befor…

RAGFlow 登錄界面點擊登錄無反應,控制臺報錯 502 Bad Gateway 解決方法

遇到的問題 在使用RAGFlow的時候&#xff0c;登錄不進去&#xff0c;但是之前能登錄。 還出現了輸入地址直接進入工作界面&#xff0c;但是進行不了任何操作的bug&#xff1b;以及無法上傳文檔的問題&#xff08;其實都是因為沒登錄&#xff09;。 登陸界面報錯如圖顯示。 …

數據結構第3問:什么是線性表?

線性表 線性表由具有相同數據類型的n個元素構成&#xff0c;這些元素之間存在一一對應的線性關系。其中n為表長&#xff0c;當n0的時候線性表是一個空表。簡單來說&#xff0c;線性表中的元素排列成一條線&#xff0c;每個元素最多有一個直接的前驅和后繼&#xff08;除第一個和…

常見CMS 靶場復現

一、wordpass1.修改模版文件getshell搭建網站登錄網站后臺更改網站模版的相關文件寫入一句話木馬憑借路徑訪問/wp-content/themes/twentyfifteen/404.php/?aphpinfo();2.上傳夾帶木馬的主題getshell外觀-->主題-->添加-->上傳-->瀏覽-->安裝-->訪問木馬文件…