講解C語言程式設計中指標賦值的入門例項

2022-10-07 06:36:09 字數 2497 閱讀 7771

從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()

語義分析:

看出來了沒有,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()

語義分析:

看了這段**,你明白了什麼?有沒有發現pi值是不能重新賦值修改了。它只能永遠指向初始化時的記憶體位址了。相反,這次你可以通過*pwww.cppcns.comi來修改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()

情況二:const int *pi指標指向const int i1的情況

#include "stdio.h"

main()

情況三:用const int *const pi宣告的指標

#include "stdio.h"

main()

本文標題: 講解c語言程式設計中指標賦值的入門例項

本文位址: /ruanjian/c/135951.html

C 中指標賦值原則

指標 pointer 是 指向 point to 另外一種型別的復合型別,它實現了對其它物件的間接訪問。定義指標型別的方法將宣告符寫成 d的形式,其中 d是變數名,如以下 宣告了乙個整形指標 int ip1 對指標進行賦值只能使用以下四種型別的值 1 空指標 2 型別匹配的物件的位址 3 同型別的另...

對C語言中指標的入門理解

當指標p的值為物件x的位址時,我們一般會說 p指向x 接著進行 xiaohong xiaoli 的複製,我們就可以得出 小紅喜歡小李 xiaolin xiaohong的資料型別是 指向int型變數的指標型 xiaolin xiaozhang xiaohong xiaowang 從以上賦值語句也可以發...

C語言指標賦值

1 指標的初始化 指標初始化時,的右運算元必須為記憶體中資料的位址,不可以是變數,也不可以直接用整型位址值 但是int p 0 除外,該語句表示指標為空 此時,p只是表示定義的是個指標變數,並沒有間接取值的意思。例如 int a 25 int ptr a int b 10 int point b i...