程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 講授C說話編程中指針賦值的入門實例

講授C說話編程中指針賦值的入門實例

編輯:關於C++

講授C說話編程中指針賦值的入門實例。本站提示廣大學習愛好者:(講授C說話編程中指針賦值的入門實例)文章只能為提供參考,不一定能成為您想要的結果。以下是講授C說話編程中指針賦值的入門實例正文


從const int i 說起

你曉得我們聲明一個變量時象如許int i ;這個i是能夠在它處從新變賦值的。以下:

int i = 0;
/* . . . */
i = 20; /*這裡從新賦值了*/

不外有一天我的法式能夠須要如許一個變量(暫且稱它變量),在聲明時就賦一個初始值。以後我的法式在其它任何處都不會再去從新對它賦值。那我又應當怎樣辦呢?用const 。

/* . . . */
const int ic =20;
/* . . . */
ic = 40; /*如許是弗成以的,編譯時是沒法經由過程,由於我們不克不及對const 潤飾的ic從新賦值的。*/
/*如許我們的法式就會更早更輕易發明成績了。*/
/* . . . */

有了const潤飾的ic 我們不稱它為變量,而稱符號常量,代表著20這個數。這就是const 的感化。ic是不克不及在它處從新賦新值了。

熟悉了const 感化以後,別的,我們還要曉得格局的寫法。有兩種:

const int ic = 20;


int const ic = 20;

它們是完整雷同的。這一點我們是要清晰。總之,務需要記住const 與int哪一個寫前都不影響語義。有了這個概念後,我們來看這兩個家伙:

const int *pi


int const *pi

按通俗的邏輯看,它們的語義有分歧嗎?呵呵,只需記住一點:int 與const 哪一個放前哪一個放後都是一樣的,就比如const int ic;與int const ic;一樣。也就是說,它們是雷同的。

好了,我們如今曾經弄定一個“雙包胎”的成績。那末

int *const pi;

與前兩個語句又有甚麼分歧呢?上面就來詳細剖析它們的格局與語義吧。
先來講說const int *pi是甚麼感化 (固然int const *pi也是一樣的,後面我們說過,它們現實是一樣的)。看上面的例子:

#include "stdio.h"

main()
{
  /* 代碼開端 */
  int i1 = 30;
  int i2 = 40;
  /* 如今 pi 變量的內容為 i1 的內存地址 */
  const int *pi = &i1;
  /* 留意這裡,pi可以在隨意率性時刻從新賦值一個新內存地址*/
  /* pi 變量的內容為 i2 的內存地址 */
  pi = &i2;
  /* 想一想看:這裡能用*pi = 80來取代嗎?固然不克不及!*/
  i2 = 80;
  printf("%d\n", *pi); /* 輸入是80 */
  /* 代碼停止 */
}

語義剖析:

看出來了沒有,pi的值是可以被修正的。即它可以從新指向另外一個地址的,然則,不克不及經由過程*pi來修正i2的值。這個規矩相符我們後面所講的邏輯嗎?固然相符了。

起首const 潤飾的是全部*pi(留意,我寫的是*pi而不是pi)。所以*pi是常量,是不克不及被賦值的(固然pi所指的i2是變量,不是常量)。

其次,pi前並沒有效const 潤飾,所以pi是指針變量,能被賦值從新指向另外一內存地址的。你能夠會疑問:那我又若何用const 來潤飾pi呢?其實,你留意到int *const pi中 const 的地位就年夜概可以明確了。請記住,經由過程格局看語義。哈哈,你能夠曾經看出了紀律吧?那上面的一節也就沒需要看下去了。不外我還得持續我的戰役。

再看int *const pi

確切,int *const pi與後面的int const *pi會很輕易給混雜的。留意:後面一句的const 是寫在pi前和*號後的,而不是寫在*pi前的。很明顯,它是潤飾限制pi的。我先讓你看例子:

#include "stdio.h"

main()
{
  /* 代碼開端 */
  int i1 = 30;
  int i2 = 40;
  int *const pi = &i1;
  /* pi = &i2; 留意這裡,pi不克不及再如許從新賦值了,即不克不及再指向另外一個新地址。*/
  /* 所以我曾經正文了它。*/
  i1 = 80; /* 想一想看:這裡能用 *pi = 80; 來取代嗎?可以,這裡可以經由過程*pi修正i1的值。(第5行的正文)*/
  /* 請自行與後面一個例子比擬。 */
  printf("%d", *pi); /* 輸入是80 */
  /* 代碼停止 */
}

語義剖析:

看了這段代碼,你明確了甚麼?有無發明pi值是不克不及從新賦值修正了。它只能永久指向初始化時的內存地址了。相反,此次你可以經由過程*pi來修正i1的值了。與前一個例子對比一下吧,看以下的兩點剖析:

pi由於有了const 的潤飾,所以只是一個指針常量:也就是說pi值是弗成修正的(即pi弗成以從新指向i2這個變量了)(請看第4行的正文)。
全部*pi的後面沒有const 的潤飾。也就是說,*pi是變量而不是常量,所以我們可以經由過程*pi來修正它所指內存i1的值(請看第5行的正文)。
總之一句話,此次的pi是一個指向int變量類型數據的指針常量。

我最初總結兩句:

假如const 潤飾在*pi前,則不克不及改的是*pi(即不克不及相似如許:*pi=50;賦值)而不是指pi。
假如const 是直接寫在pi前,則pi不克不及改(即不克不及相似如許:pi=&i;賦值)。
請你務必先記住這兩點,信任你必定不會再被它們給弄糊了。如今再看這兩個聲明語句int const *pi和int *const pi時,呵呵,你會頭昏眼花照樣很輕松舒服?它們各自聲明的pi分離能修正甚麼,不克不及修正甚麼?再思慮下這些成績。

彌補三種情形

這裡,我再彌補以下三種情形。其實只需下面的語義弄清晰了,這三種情形也就曾經被包括了。不外作為三種詳細的情勢,我照樣簡略提一下吧。

情形一:int *pi指針指向const int i常量的情形

#include "stdio.h"

main()
{
  /* begin */
  const int i1 = 40;
  int *pi;
  pi = &i1; /* 如許可以嗎?不可,VC下是編譯錯。*/
  /* const int 類型的i1的地址是不克不及賦值給指向int 類型地址的指針pi的。不然pi豈不是能修正i1的值了嗎!*/
  pi = (int *) &i1; /* 如許可以嗎?強迫類型轉換可是C所支撐的。*/
  /* VC下編譯經由過程,然則仍不克不及經由過程 *pi = 80來修正i1的值。去嘗嘗吧!看看詳細的如何。*/
  /* end */
}

情形二:const int *pi指針指向const int i1的情形

#include "stdio.h"

main()
{
  /* begin */
  const int i1=40;
  const int * pi;
  pi=&i1;/* 兩個類型雷同,可以如許賦值。很明顯,i1的值不管是經由過程pi照樣i1都不克不及修正的。 */
  /* end */
}

情形三:用const int *const pi聲明的指針

#include "stdio.h"

main()
{
  /* begin */
  int i;
  const int * const pi=&i; /*你能想象pi可以或許作甚麼操作嗎?pi值不克不及改,也不克不及經由過程pi修正i的值。由於不論是*pi照樣pi都是const的。 */
  /* end */
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved