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

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

發布時間:2016-2-18 14:13    發布者:designapp
關鍵詞: C語言 , 指針
  懂得C語言的人都知道,C語言之所以強大,以及其自由性,絕大部分體現在其靈活的指針運用上。因此,說指針是c語言的靈魂,一點都不為過。所以從我的標題加了個(一)也可以看出指針的重要性,我盡可能的向大家交代清楚我對于指針的理解。所以在講解的過程中我盡可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對于指針的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運行,希望下面的講解能夠對你有所幫助。
  首先讓我們來看看定義一個指針的一般形式為:
  基類型 *指針變量名
  看了上面的指針的定義形式,我們可能對于有些地方會有疑惑,如為什么要指定基類型呢?因為我們都知道整型和字符型在內存中占的字節數是不相同的,當我們進行指針的移動和指針的運算時,如果指針指向的是一個整型變量,那么指針移動一個位置就是移動4個字節,但是如果指針指向的是一個字符型的變量,那么指針移動的就是一個字節,因此我們必須規定指針變量所指向的基類型。
  為了不枯燥的講解我們來看看下面的代碼吧。(注意:本博客的所有代碼均使用vc6編譯運行,所以可能有的規則跟C語言的稍有區別)
  #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);
  }
  運行結果如下:
  


  在此我們定義了兩個整型指針int *pointer_1,*pointer_2;,它們分別指向變量a和b,值得注意的是*pointer_1和a、*pointer_2和b是共用同一個存儲空間的,當我們在接下類的代碼中改變 *pointer_1=300;時,由輸出就可以看出來a的值也跟隨發生了改變。但是當我們聲明了一個 int c=500;之后,使用pointer_2=&c;,b的值不變,僅僅是改變*pointer_2,因為我僅僅是改變了*pointer_2指向了c的存儲空間,如果有有興趣的讀者可以自己驗證下如果我們修改了a的值之后*pointer_1的值會跟隨一起改變,因為他們指向的是同一個存儲空間。
  接下來看看如何在函數的參數中來使用指針。
  #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);
  }
  初步分析上面的代碼,看似是要通過一個函數的調用來實現一個a、b的交換,還有就是通過c=a;、 d=b;來實現對c、d賦初值。先來看看下面的運行結果:
  


  結果跟我們想象的不一樣,a、b沒有實現交換的原因是因為我們使用的是傳值,而不是傳址,所以調用的過程中做的處理就是把a、b的值復制到另外申請的兩個空間p1、p2中去,因而交換操作是在p1、p2的空間中進行的,所以對于a、b的值并沒有影響。c、d的初值為什么沒有跟a、b的值一樣呢,因為我們在初始化的過程中給c、d賦初值的時候a、b的并沒有給定初值,所以a、b的初值是在編譯的過程中由系統給定的,又因為我們申請的c、d的空間是跟a、b沒有任何關系的,所以接下來再對a、b賦初值的時候c、d的初值并不會改變。
  下一個代碼:
  #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("********************調用前******************\n");
  printf("a=%d\tb=%d\n",a,b);
  swap(pointer_1,pointer_2);
  printf("********************調用后******************\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;
  }
  看看上面這個代碼似乎滿足了我們前面說的傳址的要求,那先讓我們來看看實驗結果吧。
  


  結果似乎也是出乎我們的意料之外,為什么使用了傳值卻還是沒有能夠實現呢?如果我們在調用函數中加上一句 printf("*p1=%d\t*p2=%d\n",*p1,*p2);,得到下面的結果:


  從結果來看似乎告訴我們,我們已經實現交換了,但是為什么沒有能夠返回來呢?在這里要注意了,因為我們在函數的交換語句僅僅是改變了局部指針變量p1和p2的值,所以沒有改變a、b的值,所以使用printf("*p1=%d\t*p2=%d\n",*p1,*p2);使得我們的確看到了a、b交換的假象,僅僅是改變了局部變量p1和p2的值。
  下一個代碼:
  #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("********************調用前******************\n");
  printf("a=%d\tb=%d\n",a,b);
  swap(pointer_1,pointer_2);
  printf("********************調用后******************\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;
  }
  看看也行結果:
  


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

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 無線充電基礎知識及應用培訓教程2
  • 安靜高效的電機控制——這才是正確的方向!
  • 想要避免發生災難,就用MPLAB® SiC電源仿真器!
  • 無線充電基礎知識及應用培訓教程3
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产啪爱视频精品免视 | 男人的天堂欧美 | 久久久久久免费精品视频 | 日本欧美一区二区三区 | 三级视频网站在线观看视频 | 玖玖精品在线视频 | 99久久国产综合精品网成人影院 | 亚洲国产天堂久久综合226 | 麻豆md传媒新剧国产在线 | 日本欧美一区二区三区视频 | swag精品| 亚洲高清在线 | 亚洲综合五月天 | 久久免费高清视频 | 久久精品国产亚洲综合色 | 99视频久久 | 国产精品自线在线播放 | 国产视频精品视频 | 西野翔有码中文字幕在线 | 久久久免费精品视频 | 97免费视频在线观看 | 天海翼在线观看亚洲一区 | 国产在线观看99 | 久久久久免费精品国产 | 2017亚洲男人天堂 | 亚洲精品tv久久久久久久久 | 日韩精品一区二区三区中文在线 | 亚洲欧美日韩成人网 | 精品一区精品二区 | 台湾精品视频在线播放 | 99re热这里只有精品66 | 国内精品久久久久久麻豆 | 996热精品视频在线观看 | 综艺在线看免费高清 | 91成人在线免费视频 | 国产成人精品免费视频 | 侠盗高飞在线观看免费完整版 | 婷婷久久综合九色综合98 | 思思久久好好热精品国产 | 在线免费观看亚洲 | 欧美中文字幕一区二区三区 |