国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C語言的那些小秘密之指針(一)

發(fā)布時(shí)間:2016-2-18 14:13    發(fā)布者:designapp
關(guān)鍵詞: C語言 , 指針
  懂得C語言的人都知道,C語言之所以強(qiáng)大,以及其自由性,絕大部分體現(xiàn)在其靈活的指針運(yùn)用上。因此,說指針是c語言的靈魂,一點(diǎn)都不為過。所以從我的標(biāo)題加了個(gè)(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對(duì)于指針的理解。所以在講解的過程中我盡可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對(duì)于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運(yùn)行,希望下面的講解能夠?qū)δ阌兴鶐椭?br />   首先讓我們來看看定義一個(gè)指針的一般形式為:
  基類型 *指針變量名
  看了上面的指針的定義形式,我們可能對(duì)于有些地方會(huì)有疑惑,如為什么要指定基類型呢?因?yàn)槲覀兌贾勒秃妥址驮趦?nèi)存中占的字節(jié)數(shù)是不相同的,當(dāng)我們進(jìn)行指針的移動(dòng)和指針的運(yùn)算時(shí),如果指針指向的是一個(gè)整型變量,那么指針移動(dòng)一個(gè)位置就是移動(dòng)4個(gè)字節(jié),但是如果指針指向的是一個(gè)字符型的變量,那么指針移動(dòng)的就是一個(gè)字節(jié),因此我們必須規(guī)定指針變量所指向的基類型。
  為了不枯燥的講解我們來看看下面的代碼吧。(注意:本博客的所有代碼均使用vc6編譯運(yùn)行,所以可能有的規(guī)則跟C語言的稍有區(qū)別)
  #include
  int main()
  {
  int a,b;
  int *pointer_1,*pointer_2;
  a=100;
  b=200;
  pointer_1=&a;
  pointer_2=&b;
  printf("--------------------變換前-------------------\n");
  printf("a=%d\tb=%d\n",a,b);
  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);
  *pointer_1=300;
  int c=500;
  pointer_2=&c;
  printf("--------------------變換后-------------------\n");
  printf("a=%d\t*pointer_1=%d\n",a,*pointer_1);
  printf("c=%d\tb=%d\t*pointer_2=%d\n",c,b,*pointer_2);
  }
  運(yùn)行結(jié)果如下:
  


  在此我們定義了兩個(gè)整型指針int *pointer_1,*pointer_2;,它們分別指向變量a和b,值得注意的是*pointer_1和a、*pointer_2和b是共用同一個(gè)存儲(chǔ)空間的,當(dāng)我們?cè)诮酉骂惖拇a中改變 *pointer_1=300;時(shí),由輸出就可以看出來a的值也跟隨發(fā)生了改變。但是當(dāng)我們聲明了一個(gè) int c=500;之后,使用pointer_2=&c;,b的值不變,僅僅是改變*pointer_2,因?yàn)槲覂H僅是改變了*pointer_2指向了c的存儲(chǔ)空間,如果有有興趣的讀者可以自己驗(yàn)證下如果我們修改了a的值之后*pointer_1的值會(huì)跟隨一起改變,因?yàn)樗麄冎赶虻氖峭粋(gè)存儲(chǔ)空間。
  接下來看看如何在函數(shù)的參數(shù)中來使用指針。
  #include
  swap(int p1,int p2)
  {
  int temp;
  temp=p1;
  p1=p2;
  p2=temp;
  }
  int main()
  {
  int a,b;
  int *pointer_1,*pointer_2;
  int c,d;
  c=a;
  d=b;
  pointer_1=&a;
  pointer_2=&b;
  a=20;
  b=30;
  swap(a,b);
  printf("a=%d\tb=%d\n",a,b);
  printf("a=%d\tb=%d\n",*pointer_1,*pointer_2);
  printf("c=%d\td=%d\n",c,d);
  }
  初步分析上面的代碼,看似是要通過一個(gè)函數(shù)的調(diào)用來實(shí)現(xiàn)一個(gè)a、b的交換,還有就是通過c=a;、 d=b;來實(shí)現(xiàn)對(duì)c、d賦初值。先來看看下面的運(yùn)行結(jié)果:
  


  結(jié)果跟我們想象的不一樣,a、b沒有實(shí)現(xiàn)交換的原因是因?yàn)槲覀兪褂玫氖莻髦担皇莻髦罚哉{(diào)用的過程中做的處理就是把a(bǔ)、b的值復(fù)制到另外申請(qǐng)的兩個(gè)空間p1、p2中去,因而交換操作是在p1、p2的空間中進(jìn)行的,所以對(duì)于a、b的值并沒有影響。c、d的初值為什么沒有跟a、b的值一樣呢,因?yàn)槲覀冊(cè)诔跏蓟倪^程中給c、d賦初值的時(shí)候a、b的并沒有給定初值,所以a、b的初值是在編譯的過程中由系統(tǒng)給定的,又因?yàn)槲覀兩暾?qǐng)的c、d的空間是跟a、b沒有任何關(guān)系的,所以接下來再對(duì)a、b賦初值的時(shí)候c、d的初值并不會(huì)改變。
  下一個(gè)代碼:
  #include
  swap(int *p1,int *p2)
  {
  int *temp;
  temp=p1;
  p1=p2;
  p2=temp;
  }
  int main()
  {
  int a,b;
  int *pointer_1,*pointer_2;
  int c,d;
  c=a;
  d=b;
  pointer_1=&a;
  pointer_2=&b;
  a=20;
  b=30;
  printf("********************調(diào)用前******************\n");
  printf("a=%d\tb=%d\n",a,b);
  swap(pointer_1,pointer_2);
  printf("********************調(diào)用后******************\n");
  printf("a=%d\tb=%d\n",a,b);
  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);
  printf("c=%d\td=%d\n",c,d);
  return 0;
  }
  看看上面這個(gè)代碼似乎滿足了我們前面說的傳址的要求,那先讓我們來看看實(shí)驗(yàn)結(jié)果吧。
  


  結(jié)果似乎也是出乎我們的意料之外,為什么使用了傳值卻還是沒有能夠?qū)崿F(xiàn)呢?如果我們?cè)谡{(diào)用函數(shù)中加上一句 printf("*p1=%d\t*p2=%d\n",*p1,*p2);,得到下面的結(jié)果:


  從結(jié)果來看似乎告訴我們,我們已經(jīng)實(shí)現(xiàn)交換了,但是為什么沒有能夠返回來呢?在這里要注意了,因?yàn)槲覀冊(cè)诤瘮?shù)的交換語句僅僅是改變了局部指針變量p1和p2的值,所以沒有改變a、b的值,所以使用printf("*p1=%d\t*p2=%d\n",*p1,*p2);使得我們的確看到了a、b交換的假象,僅僅是改變了局部變量p1和p2的值。
  下一個(gè)代碼:
  #include
  #include
  swap(int *p1,int *p2)
  {
  int *temp;
  temp=(int *)malloc(sizeof(int));
  *temp=*p1;
  *p1=*p2;
  *p2=*temp;
  free(temp);
  }
  int main()
  {
  int a,b;
  int *pointer_1,*pointer_2;
  int c,d;
  c=a;
  d=b;
  pointer_1=&a;
  pointer_2=&b;
  a=20;
  b=30;
  printf("********************調(diào)用前******************\n");
  printf("a=%d\tb=%d\n",a,b);
  swap(pointer_1,pointer_2);
  printf("********************調(diào)用后******************\n");
  printf("a=%d\tb=%d\n",a,b);
  printf("*pointer_1=%d\t*pointer_2=%d\n",*pointer_1,*pointer_2);
  printf("c=%d\td=%d\n",c,d);
  return 0;
  }
  看看也行結(jié)果:
  


  最后終于出現(xiàn)了一個(gè)我們想要的結(jié)果了。從以上的分析讀者自己也知道原因所在了吧,這里操作的才是p1、p2所指向的地址,才真正的做到了對(duì)于a、b存儲(chǔ)空間的數(shù)值的交換。細(xì)心的讀者可能看到了我們?cè)诖a中用了紅色部分標(biāo)記的代碼,它完全可以用一句int temp;來替代,之所以我們?cè)谶@里要用int *temp;無非是要大家牢記對(duì)于指針一些特殊的使用,如果我們沒有這句temp=(int *)malloc(sizeof(int));,以上代碼在編譯的過程中是不會(huì)有任何錯(cuò)誤的,但是在運(yùn)行的過程中就會(huì)出現(xiàn)錯(cuò)誤,所以通常情況下我們?cè)谑褂弥羔樀倪^程中,要特別注意野指針情況的出現(xiàn),以免出現(xiàn)一些莫名奇妙的有錯(cuò)。
                               
               
本文地址:http://m.qingdxww.cn/thread-160866-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • 使用SAM-IoT Wx v2開發(fā)板演示AWS IoT Core應(yīng)用程序
  • 使用Harmony3加速TCP/IP應(yīng)用的開發(fā)培訓(xùn)教程
  • 集成高級(jí)模擬外設(shè)的PIC18F-Q71家族介紹培訓(xùn)教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿(mào)澤電子(Mouser)專區(qū)
關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一起射导航| 久久精品国产亚洲精品2020| 国产片MV在线观看| 热中文热国产热综合| 有码 亚洲 制服 国产 在线| 青青青久热国产精品视频| 日本一区二区三区视频在线| 亚洲国产香蕉视频欧美| 一级毛片在线看| 九九热这里有精品| 亚洲国产综合另类视频| 亚洲美女在线视频| 日本成人免费在线观看| 深夜国产| av在线色| 美女搜查官被高难度黑人在线播放| 日韩国产欧美| 青青青国产| 手机看片1024精品日韩| 99re28久久热在线观看| 肉肉描写很细致的黄文| 亚洲成人动漫在线| 欧美一卡2卡3卡四卡海外精品| 五月婷婷丁香在线观看| 一二三四视频中文字幕| 国产精品99久久久久久WWW| 日韩精品 中文字幕 有码| 日韩免费在线视频| 日本优女| 我要看女人的逼| 999久久国产精品免费人妻| 日本高清天码一区在线播放| 亚洲综合片| 午夜老司机福利| 曰韩在线| 精品在线观看一区| 特级一级黄色片| 欧洲毛片真人| 一级黄色大片免费| 最新在线精品国自拍视频| 日本男女动态图|