【C基礎】指針/指針運算/二級指針/函數指針

指針定義:

指針是一種數據類型,使用它可以用來定義指針變量,指針變量中存儲的其實是整數,這種整數代表了內存的編號。
指針的使用:
1、函數之間相獨立,但有些時候需要共享變量。傳參是值傳遞全局變量容易命名沖突使用數組還需要傳遞長度命名空間是獨立的,但地址空間是同一個,所有指針可以解決這個問題。
2、由于函數之間傳參是值傳遞(內存拷貝),對于字節數比較多的變量,值傳遞效率較低,如果傳遞變量的地址只需要傳遞4|8字節。3、堆內存無法取名字,它不能像data、bss、stack讓變量名與內存建立聯系,只能使用指針記錄堆內存的地址來使用堆內存。
指針使用方法:
定義:類型* 變量名_p;1、指針變量與普通變量的用法有很大區別,建議在取名以p結尾加心區分。2、指針變量與普通變量一樣默認值是隨機的,一般初始為 NULL。3、指針的類型決定了它可以訪問多少個字節。4、一個*只能定義一個指針變量。int* p1,p2,p3; // 只有p1 是指針變量,p2,p3都是int類型變量int *p1,*p2,*p3; // p1 p2 p3都是指針變量
賦值:變量名_p = 地址;指向棧內存:int* p = #指向堆內存:int* p = malloc(4);
解引用:*p空指針變量中記錄的內存編號去訪問內存,該過程可能產生段錯誤,原因是里面存儲的內存編號是非法的。注意:訪問的字節數由指針變量的類型決定。練習1、實現一個變量交換函數,調用它對一個數組進行排序。void swap(int* p1,int* p2);練習2、實現個函數計算兩個整數的最大公約數,和最小公倍數,最大公約數用return返回,最小公倍數使用指針處理。3 6 33 6 6
要注意的問題:
空指針:值為NULL的指針變量叫空指針,如果進行解引用就會產生段錯誤。NULL也是一種錯誤標志,如果一個函數返回值是指針類型,當函數執行出錯返回值就是NULL。如何避免空指針帶來的段錯誤:使用來歷不明的指針前做一判斷。1、當函數的參數是指針,別人傳給你的就有可能是空指針。2、從函數獲取的返回值也可能是空指針。if(NULL == p)注意:NULL在絕大多數系統中是0,在個別系統中是1。野指針:指向不確定的內存空間。解引用野指針的后果:1、段錯誤2、臟數據3、一切正常野指針比空指針的危害更嚴重,因它無法判斷出來,而且可能是隱藏型的錯誤短時間內不暴露出來。所有的野指針都是程序員自己制造出來的,如何避免產生野指針:1、定義指針變量時一定初始化。2、函數不返回棧內存的地址。3、指針指向的內存釋放后,指針變量要及時置空。

指針運算:

指針變量中存儲的是整數,理論上整型數據可以使用的運算符它都可以用,但大多數運算都無意義的。
指針+n <=> 寬度*n+指針  前面n個元素
指針-n <=> 指針-寬度*n  后退n個元素
指針-指針 <=> (指針-指針)/寬度 計算出兩個指針之間相隔多少個元素

const與指針:

const int* p; 指針所指向的內存不可修改。當我們為了提高傳參的效率而使用指針時,傳參的效率高了,但變量也有被修改的風險,這種寫法可以保護指針所指向的內存。
int const *p; 同上
int * const p; 指針變量不可被修改
const int* const p; 指針變量和指針所指向的內存都不可修改。
int const * const p; 同上

指針數組與數組指針:

指針數組:就是由指針組成的數組,它的成員是指針變量。類型* arr[長度];
數組指針:專門指針數組的指針。類型 (*arr)[長度];

指針與數組名:

數組名是一種特殊的指針,它是常量,不能修改它的值,它與數組的內存是映射關系。數組名 == &數組名指針變量有自己的存儲空間,如果它存儲是數組的首地址,指針可以當數組使用,數組名也可以當指針使用。數組名[i] == *(數組名+1)數組作為函數的參數時入脫變成了指針,所以長度丟失。

二級指針:

二級指針就是指向指針的指針,里面存儲的是指針變量的地址。
定義:類型** 變量名_pp;
賦值:變量名 = &指針;
解引用:*變量名 <=> 指針**變量名 <=> *指針

函數指針:

函數名就個地址(整數),它代表函數在代碼段中所處的位置。函數指針就是指向函數的指針,它里面存儲是函數在代碼段中所處位置(函數名);typedef 返回值 (*函數指針)(類型1 參數名1,類型2 參數名2...);
函數指針 fp;使用了回調模式的庫函數:
// 快速排序
void qsort(void *base, size_t nmemb, size_t size,int(*compar)(const void *, const void *));// 二分查找
void *bsearch(const void *key, const void *base,size_t nmemb, size_t size,int (*compar)(const void *, const void *));

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

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

相關文章

中醫養生 選對方法就成功一半

在醫院門診室&#xff0c;因為腸胃不適前來看病的林先生。問及他平時的養生之道&#xff0c;他笑談&#xff0c;現在也正困惑著呢。 原來&#xff0c;最近他有兩個朋友&#xff0c;在單位體檢時分別被查出患有腎結石和膽囊炎&#xff0c;他本人最近也犯胃病。 最令人奇怪的一…

二叉查找樹,紅黑樹

漫畫算法&#xff1a;什么是紅黑樹&#xff1f;&#xff08;適合初學紅黑樹小白簡單易懂&#xff09; 2018年09月14日 09:55:54 蘇杭-Java工程師 閱讀數&#xff1a;494———————————— 二叉查找樹&#xff08;BST&#xff09;具備什么特性呢&#xff1f; 1.左子樹上所…

如何在 CentOS 7上安裝和使用 Docker Compose

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 介紹 Docker是一個很好的工具&#xff0c;但要真正充分利用它的潛力&#xff0c;最好是應用程序的每個組件都在它自己的容器中運行。對于…

WebSSH2安裝過程可實現WEB可視化管理SSH工具

目錄 Chrome web Secure Shell Extension gotty GateOne noVNCvncserver XtermjsSSH2nodejs nodejstty.js CheungSSH TriAquae https://github.com/Scirh/Python/tree/master/django https://www.smarthomebeginner.com/install-shellinabox-on-ubuntu/#64-bit https://gist.gi…

原碼反碼補碼位運算,

進制轉換&#xff1a; 十進制轉二進制&#xff1a; 求余法&#xff1a;用2對數據求余&#xff0c;然后再對商繼續求余&#xff0c;直到商為0結束&#xff0c;過程中產生的余數就是該數據的二進制(逆序)。 求權法&#xff1a;數據 - 2^(n-1) 如果可以減 第n位就是1&#xff0c;否…

一個人幸運的前提,是他有能力改變自己

很多時候&#xff0c;我們羨慕那些幸運的人&#xff0c;卻看不到他們為此做出的努力和改變。 其實&#xff0c;一個人的幸運并不是偶然的&#xff0c;美國成功哲學家金洛恩說過這么一句話&#xff1a;“成功不是追求得來的&#xff0c;而是被改變后的自己主動吸引來的。” …

劍指Offer-正則表達式匹配(Python)

1 題干內容 請實現一個函數用來匹配包括.和*的正則表達式。模式中的字符.表示任意一個字符&#xff0c;而*表示它前面的字符可以出現任意次&#xff08;包含0次&#xff09;。 在本題中&#xff0c;匹配是指字符串的所有字符匹配整個模式。 例如&#xff0c;字符串aaa與模式a.a…

Docker 制作鏡像的方式

其它制作鏡像的方式 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 除了標準的使用 Dockerfile 生成鏡像的方法外&#xff0c;由于各種特殊需求和歷史原因&#xff0c;還提供了一些其它…

【算法】快排

快速排序 其利用的思想就是分治思想&#xff0c;最開始先從數組中隨機選擇一個元素p&#xff08;為什么隨機下面解釋&#xff09;&#xff0c;然后以這個元素對數組中的元素進行分類&#xff0c;數組左側都是小于p的元素&#xff0c; 右側都是大于等于p的元素。這樣就讓數組分成…

【C基礎】堆內存創建/釋放和內存清理函數/內存泄漏

本期涉及到了較多的指針&#xff0c;沒有徹底領悟的同學請翻閱之前的博文~ 一閃一閃亮晶晶&#xff0c;滿天都是小星星*** 什么是堆內存&#xff1a; 是進程的一個內存段(text、data、bss、heap、stack)之一&#xff0c;由程序員手動管理&#xff0c; 特點就是足夠大&#x…

19_05_01校內訓練[polygon]

題意 把一個邊長為1的正n邊形放到一個正m邊形中&#xff0c;要求m邊形完全覆蓋n邊形&#xff0c;可以有交點&#xff0c;并且中心重合。求正m邊形的最小邊長&#xff0c;至少精確到6位。要求logn計算。 思考 先考慮m|n的情況。 我們知道&#xff0c;正m邊形的邊長與可行區域&am…

六度人脈 全球最高效的人脈法則(圖)

六度人脈這一概念&#xff0c;在20世紀60年代由美國心理學家Stanley Milgram提出并驗證。 所謂六度人脈&#xff0c;即地球上所有的人都可以通過六層以內的熟人關系鏈和其他人聯系起來。 通俗地說&#xff1a;“最多通過六個人你就可以認識地球上任何一個陌生人。” SNS(社會…

[轉]numpy中的np.max 與 np.maximum區別

轉自&#xff1a;https://blog.csdn.net/lanchunhui/article/details/52700895 轉載于:https://www.cnblogs.com/xianhan/p/10609319.html

JVM 的 Finalization Delay 引起的 OOM(java.lang.OutOfMemoryError:null at sun.misc.Unsafe.allocateMemory.)

今天在壓力測試環境某一個服務出現crash了&#xff0c;經過一番檢查&#xff0c;終于發現是由于JVM的Finalization Delay引起的&#xff0c;這個問題比較特殊&#xff0c;這里記錄一下。 這個服務是用Java寫的&#xff0c;主要完成的功能是根據特定的指令文件生成mp4文件&#…

win10 php7+apache2.4的配置以及遇到的問題及解決

首先進入PHP官網下載php7的版本,我下的是PHP7.1.28,在PHP的下載頁面注意劃紅線和綠線的地方(我畫的) 1.畫了紅線的意思是請使用由apache lounge提供的編譯文件,也就是點進藍色Apache lounge這里下載. 2.畫了綠色的線的意思是用Apache的話你必須使用Thread Safe(線程安全)的PHP…

緩存區的輸入輸出,字符串常用操作,實現strlen/strcpy/strcat/strcmp函數)

輸出緩沖區&#xff1a; 程序輸入的數據并不能立即顯示在屏幕上&#xff0c;而是先存儲在輸出緩沖區中&#xff0c;滿足一些條件后才顯示出來。 1、遇到\n后 2、遇到輸入語句 3、當輸出緩沖區滿4K 4、當程序結束 5、手動刷新 fflush(stdout) 緩沖區機制可以提高數據的讀寫速度…

理性分散投資 收益袋袋平安

理財錦囊 想要投資理財&#xff0c;不光可以選擇股票和債券這類入門產品&#xff0c; 實際上&#xff0c;還可選擇其他低風險及高回報的投資產品&#xff0c;例如外匯、期貨和商品。 針對此&#xff0c;幾位分析師預測了2014年各國經濟走勢的重點&#xff0c;協助散戶們分配…

AI一周熱聞:華為豪擲3.3億劍橋買地,自建光芯片工廠;比特大陸IPO失敗,組織架構調整...

導讀 華為豪擲3.3億劍橋買地&#xff0c;自建光芯片工廠蘋果春季發布會無硬件發布&#xff0c;轉型之心迫切比特大陸IPO失敗&#xff0c;組織架構調整&#xff0c;王海超任CEO特斯拉起訴小鵬汽車員工竊取商業機密英偉達發布GauGAN&#xff0c;線條色塊秒變逼真圖像用機器學習防…

Docker 環境:Nexus3.x 的私有倉庫

Nexus3.x 的私有倉庫 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 使用 Docker 官方的 Registry 創建的倉庫面臨一些維護問題。比如某些鏡像刪除以后空間默認是不會回收的&#xff…

虛擬環境vitualenv的使用

Python3開發之虛擬環境virtualenv與virtualenvwrapper 在使用 Python 開發的過程中&#xff0c;工程一多&#xff0c;難免會碰到不同的工程依賴不同版本的庫的問題&#xff1b; 亦或者是在開發過程中不想讓物理環境里充斥各種各樣的庫&#xff0c;引發未來的依賴災難。 此時&am…