C語言中的二級指針(雙指針)

二級指針又叫雙指針。C語言中不存在引用,所以當你試圖改變一個指針的值的時候必須使用二級指針。C++中可以使用引用類型來實現。

下面講解C中的二級指針的使用方法。

例如我們使用指針來交換兩個整型變量的值。

錯誤代碼如下:

一級指針

[cpp] view plaincopyprint?
  1. #include?<stdio.h>??
  2. ??
  3. void?swap(int?*a,int?*b)??
  4. {??
  5. ????????int?*tmp=NULL;??
  6. ????????tmp=a;??
  7. ????????a=b;??
  8. ????????b=tmp;??
  9. }??
  10. ??
  11. int?main(int?argc,char?**argv)??
  12. {??
  13. ????????int?a=2;??
  14. ????????int?b=3;??
  15. ????????printf("Before?swap?a=%d??b=%d\n",a,b);??
  16. ????????swap(&a,&b);??
  17. ????????printf("After?swap?a=%d??b=%d\n",a,b);??
  18. ????????return?0;??
  19. }??

輸出的結構如下:


結果分析:不論是數值還是指針,swap函數中的參數傳遞的是總是值,所以在上述函數中即使a和b的地址已參數傳遞給swap函數,而在函數內交換的是a和b的值(main函數中a的地址和b的地址),而交換完畢,函數相應的參數從棧中彈出,并不能返回給調用函數,所以該swap函數中的操作是徒勞。可憐

這里完全可以直接交換a和b的值,不過如果a和b不是一個32位的整型變量,而是一個復雜的數據結構,這樣做會降低效率。如下;

[cpp] view plaincopyprint?
  1. void?swap(TYPE?*a,TYPE?*b)??
  2. {??
  3. ????????TYPE?tmp;??
  4. ????????tmp=*a;??
  5. ????????*a=*b;??
  6. ????????*b=tmp;??
  7. }??



二級指針

下面是使用二級指針分配內存的例子

[cpp] view plaincopyprint?
  1. #include?<stdio.h>??
  2. #include?<stdlib.h>??
  3. #include?<string.h>??
  4. void?memorylocate(char?**ptr)??
  5. {??
  6. ????????*ptr=(char?*)malloc(10*sizeof(char));??
  7. }??
  8. int?main(int?argc,char?**argv)??
  9. {??
  10. ????????char?*buffer;??
  11. ????????memorylocate(&buffer);??
  12. ????????strcpy(buffer,"12345");??
  13. ????????printf("buffer?%s\n",buffer);??
  14. ????????return?0;??
  15. }??


當想改變指針的值的時候不妨考慮使用二維指針。


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

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

相關文章

測試環境服務器硬盤塞滿問題排查

項目中出現的問題 某天下午測試環境服務器出現tab無法補全命令&#xff0c;給出的提示大概意思就是說,無可用空間無法創建臨時文件&#xff0c;不過這次跟上次出現的問題比較像&#xff0c;上次服務器出現的問題&#xff0c;因此樓主判斷可能是服務器數據盤被占滿&#xff0c;果…

alpine_glibc 構建sun jdk 8的docker鏡像

2019獨角獸企業重金招聘Python工程師標準>>> 構建系統基礎鏡像 alpine glibc 的Dockerfile內容如下&#xff1a; alpine:3.6 MAINTAINER tongqiang<tongqiangyingmail.com># Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.ENV ALP…

單工 半雙工 全雙工

1 單工 單工就是指A只能發信號&#xff0c;而B只能接收信號&#xff0c;通信是單向的&#xff0c;就象燈塔之于航船——燈塔發出光信號而航船只能接收信號以確保自己行駛在正確的航線上。 2 半雙工 半雙工就是指A能發信號給B&#xff0c;B也能發信號給A&#xff0c;但這兩…

c語言兩個循環的ys,c語言編程:從鍵盤輸入兩個數,求它們的最小公倍數

滿意答案flywisdom2019.06.20采納率&#xff1a;44% 等級&#xff1a;9已幫助&#xff1a;1064人main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//輸入兩個正整數.if(n{tempn;nm;mtemp;}pn*m;//P是原來…

每日微軟面試題

每日微軟面試題——day 1 <以下微軟面試題全來自網絡> <以下答案與分析純屬個人觀點&#xff0c;不足之處&#xff0c;還望不吝指出^_^> 題&#xff1a;.編寫反轉字符串的程序&#xff0c;要求優化速度、優化空間。 分析&#xff1a;構建兩個迭代器p 和 q &…

第八章 多態

第八章 多態1. 重寫一個類通過繼承來產生一個新類&#xff0c;繼承了父類的所有變量和方法&#xff0c;在繼承這些變量和方法的時候&#xff0c;子類也可以具有自己獨特的特征和行為。Public class fruit{Public void print(){System.out.println(“這是超類的方法”);}}Clas…

Ionic Angular自動捕獲錯誤 配置Angular2.x +

配置app.module.ts import { Pro } from ionic/pro;// These are the imports required for the code below, // feel free to merge into existing imports. import { Injectable, Injector } from angular/core; import { IonicErrorHandler } from ionic-angular;const Ioni…

信道和物理媒體的區別

一個信道可以包含很多的物理媒體嗎&#xff0c;同時一個物理媒體也可以包含很多的信道。 信道借助于物理媒體實現數據傳輸&#xff0c;在比較遠的數據傳輸過程中可能會使用多個不同的物理媒體實現數據的傳輸。 而一個物理媒體也可以借助于多路復用技術實現多條信道

c語言刪除尾部空格函數,新人提問:如何將輸出時每行最后一個空格刪除

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓如何將每行最后一個空格刪除&#xff0c;使矩陣只有數字間有空格&#xff0c;沒有多余空格&#xff1f;#include#includeint main(){int i,j,k,m,n,x,h,y;int a[15][15]{0};while(scanf("%d",&i)){k1;for(n1;n<i;…

jsonArray與 jsonObject區別與js取值

一、JSONObject和JSONArray的數據表示形式 JSONObject的數據是用 { } 來表示的&#xff0c; 例如&#xff1a; { "id" : "123", "courseID" : "huangt-test", "title" : "提交作業", "content" : nu…

計劃任務 at,cron

示例&#xff1a;每3小時echo和wall命令 轉載于:https://www.cnblogs.com/momenglin/p/8551618.html

代碼疑云

代碼疑云(1)-掌握初始化列表 代碼&#xff1a; [cpp] view plaincopy#include<iostream> using namespace std; class A { private: int x1; int x2; public: A():x2(1),x1(x2){} //初始化列表 void print() { cout<<"x1"<&…

網絡擁塞

擁塞&#xff08;Congestion&#xff09;指的是在包交換網絡中由于傳送的包數目太多&#xff0c;而存貯轉發節點的資源有限而造成網絡傳輸性能下降的情況。擁塞的一種極端情況是死鎖&#xff08;Deadlock&#xff09;&#xff0c;退出死鎖往往需要網絡復位操作。

android 多線程future,多線程FutureTask的使用方法和使用實例

FutureTask是一種可以取消的異步的計算任務。它的計算是通過Callable實現的&#xff0c;它等價于可以攜帶結果的Runnable&#xff0c;并且有三個狀態&#xff1a;等待、運行和完成。完成包括所有計算以任意的方式結束&#xff0c;包括正常結束、取消和異常。Future有個get方法而…

2017.12.26

轉載于:https://www.cnblogs.com/dyh-air/p/8118961.html

mac 下安裝pip

pip是常用的python包管理工具&#xff0c;類似于java的maven。用python的同學&#xff0c;都離不開pip。 在新mac中想用home-brew安裝pip時&#xff0c;遇到了一些小問題&#xff1a; bogon:~ wanglei$ brew install pip Error: No available formula with the name "pip&…

IT職場人生系列

IT職場人生系列之一&#xff1a;序言及找誰占卜 本文是IT職場人生系列的第一篇。 時間流逝&#xff0c;漸漸從之前在公司里邊的小弟變成大哥了&#xff0c;當年身邊比我大的程序員們都不見了&#xff0c;既沒有當領導也沒有去創業&#xff0c;就這么消失了。 年輕的程序員或…

RS-232協議

計算機與計算機或計算機與終端之間的數據傳送可以采用串行通訊和并行通訊二種方式。由于串行通訊方式具有使用線路少、成本低&#xff0c;特別是在遠程傳輸時&#xff0c;避免了多條線路特性的不一致而被廣泛采用。 在串行通訊時&#xff0c;要求通訊雙方都采用一個標準接口&am…

linux sed 找出前后三行,Linux Sed 使用示例

環境&#xff1a;CentOS鑒于語句描述蒼白無力&#xff0c;用例子直接說明。mytxt文件內容&#xff1a;zilzhang 19881110 jiangxi 18 filmzhagnsan 21321 sichuan 100 cardlisi 3435 hunan 65 TV1. 找出文件第二行$ sed -n ‘2p‘ mytxtzhagnsan 21321 sichua…

MessageBox 彈框

模擬系統的消息提示框而實現的一套模態對話框組件&#xff0c;用于消息提示、確認消息和提交內容。 從場景上說&#xff0c;MessageBox 的作用是美化系統自帶的 alert、confirm 和 prompt&#xff0c;因此適合展示較為簡單的內容。如果需要彈出較為復雜的內容&#xff0c;請使用…