亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

講解C語言編程中指針賦值的入門實(shí)例

 更新時(shí)間:2015年12月02日 15:50:30   投稿:goldensun  
這篇文章主要介紹了講解C語言編程中指針賦值的入門實(shí)例,通過const int i與int *const pi這樣兩個(gè)例子來分析指針的賦值和地址指向,需要的朋友可以參考下

從const int i 說起

你知道我們聲明一個(gè)變量時(shí)象這樣int i ;這個(gè)i是可能在它處重新變賦值的。如下:

int i = 0;
/* . . . */
i = 20; /*這里重新賦值了*/

不過有一天我的程序可能需要這樣一個(gè)變量(暫且稱它變量),在聲明時(shí)就賦一個(gè)初始值。之后我的程序在其它任何處都不會(huì)再去重新對它賦值。那我又應(yīng)該怎么辦呢?用const 。

/* . . . */
const int ic =20;
/* . . . */
ic = 40; /*這樣是不可以的,編譯時(shí)是無法通過,因?yàn)槲覀儾荒軐onst 修飾的ic重新賦值的。*/
/*這樣我們的程序就會(huì)更早更容易發(fā)現(xiàn)問題了。*/
/* . . . */

有了const修飾的ic 我們不稱它為變量,而稱符號(hào)常量,代表著20這個(gè)數(shù)。這就是const 的作用。ic是不能在它處重新賦新值了。

認(rèn)識(shí)了const 作用之后,另外,我們還要知道格式的寫法。有兩種:

const int ic = 20;


int const ic = 20;

它們是完全相同的。這一點(diǎn)我們是要清楚??傊?,務(wù)必要記住const 與int哪個(gè)寫前都不影響語義。有了這個(gè)概念后,我們來看這兩個(gè)家伙:

const int *pi


int const *pi

按普通的邏輯看,它們的語義有不同嗎?呵呵,只要記住一點(diǎn):int 與const 哪個(gè)放前哪個(gè)放后都是一樣的,就好比const int ic;與int const ic;一樣。也就是說,它們是相同的。

好了,我們現(xiàn)在已經(jīng)搞定一個(gè)“雙包胎”的問題。那么

int *const pi;

與前兩個(gè)語句又有什么不同呢?下面就來具體分析它們的格式與語義吧。
先來說說const int *pi是什么作用 (當(dāng)然int const *pi也是一樣的,前面我們說過,它們實(shí)際是一樣的)。看下面的例子:

#include "stdio.h"

main()
{
  /* 代碼開始 */
  int i1 = 30;
  int i2 = 40;
  /* 現(xiàn)在 pi 變量的內(nèi)容為 i1 的內(nèi)存地址 */
  const int *pi = &i1;
  /* 注意這里,pi可以在任意時(shí)候重新賦值一個(gè)新內(nèi)存地址*/
  /* pi 變量的內(nèi)容為 i2 的內(nèi)存地址 */
  pi = &i2;
  /* 想想看:這里能用*pi = 80來代替嗎?當(dāng)然不能!*/
  i2 = 80;
  printf("%d\n", *pi); /* 輸出是80 */
  /* 代碼結(jié)束 */
}

語義分析:

看出來了沒有,pi的值是可以被修改的。即它可以重新指向另一個(gè)地址的,但是,不能通過*pi來修改i2的值。這個(gè)規(guī)則符合我們前面所講的邏輯嗎?當(dāng)然符合了。

首先const 修飾的是整個(gè)*pi(注意,我寫的是*pi而不是pi)。所以*pi是常量,是不能被賦值的(雖然pi所指的i2是變量,不是常量)。

其次,pi前并沒有用const 修飾,所以pi是指針變量,能被賦值重新指向另一內(nèi)存地址的。你可能會(huì)疑問:那我又如何用const 來修飾pi呢?其實(shí),你注意到int *const pi中 const 的位置就大概可以明白了。請記住,通過格式看語義。哈哈,你可能已經(jīng)看出了規(guī)律吧?那下面的一節(jié)也就沒必要看下去了。不過我還得繼續(xù)我的戰(zhàn)斗。

再看int *const pi

確實(shí),int *const pi與前面的int const *pi會(huì)很容易給混淆的。注意:前面一句的const 是寫在pi前和*號(hào)后的,而不是寫在*pi前的。很顯然,它是修飾限定pi的。我先讓你看例子:

#include "stdio.h"

main()
{
  /* 代碼開始 */
  int i1 = 30;
  int i2 = 40;
  int *const pi = &i1;
  /* pi = &i2; 注意這里,pi不能再這樣重新賦值了,即不能再指向另一個(gè)新地址。*/
  /* 所以我已經(jīng)注釋了它。*/
  i1 = 80; /* 想想看:這里能用 *pi = 80; 來代替嗎?可以,這里可以通過*pi修改i1的值。(第5行的注釋)*/
  /* 請自行與前面一個(gè)例子比較。 */
  printf("%d", *pi); /* 輸出是80 */
  /* 代碼結(jié)束 */
}

語義分析:

看了這段代碼,你明白了什么?有沒有發(fā)現(xiàn)pi值是不能重新賦值修改了。它只能永遠(yuǎn)指向初始化時(shí)的內(nèi)存地址了。相反,這次你可以通過*pi來修改i1的值了。與前一個(gè)例子對照一下吧,看以下的兩點(diǎn)分析:

pi因?yàn)橛辛薱onst 的修飾,所以只是一個(gè)指針常量:也就是說pi值是不可修改的(即pi不可以重新指向i2這個(gè)變量了)(請看第4行的注釋)。
整個(gè)*pi的前面沒有const 的修飾。也就是說,*pi是變量而不是常量,所以我們可以通過*pi來修改它所指內(nèi)存i1的值(請看第5行的注釋)。
總之一句話,這次的pi是一個(gè)指向int變量類型數(shù)據(jù)的指針常量。

我最后總結(jié)兩句:

如果const 修飾在*pi前,則不能改的是*pi(即不能類似這樣:*pi=50;賦值)而不是指pi。
如果const 是直接寫在pi前,則pi不能改(即不能類似這樣:pi=&i;賦值)。
請你務(wù)必先記住這兩點(diǎn),相信你一定不會(huì)再被它們給搞糊了?,F(xiàn)在再看這兩個(gè)聲明語句int const *pi和int *const pi時(shí),呵呵,你會(huì)頭昏腦脹還是很輕松愜意?它們各自聲明的pi分別能修改什么,不能修改什么?再思考下這些問題。

補(bǔ)充三種情況

這里,我再補(bǔ)充以下三種情況。其實(shí)只要上面的語義搞清楚了,這三種情況也就已經(jīng)被包含了。不過作為三種具體的形式,我還是簡單提一下吧。

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

#include "stdio.h"

main()
{
  /* begin */
  const int i1 = 40;
  int *pi;
  pi = &i1; /* 這樣可以嗎?不行,VC下是編譯錯(cuò)。*/
  /* const int 類型的i1的地址是不能賦值給指向int 類型地址的指針pi的。否則pi豈不是能修改i1的值了嗎!*/
  pi = (int *) &i1; /* 這樣可以嗎?強(qiáng)制類型轉(zhuǎn)換可是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;/* 兩個(gè)類型相同,可以這樣賦值。很顯然,i1的值無論是通過pi還是i1都不能修改的。 */
  /* end */
}

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

#include "stdio.h"

main()
{
  /* begin */
  int i;
  const int * const pi=&i; /*你能想象pi能夠作什么操作嗎?pi值不能改,也不能通過pi修改i的值。因?yàn)椴还苁?pi還是pi都是const的。 */
  /* end */
}

相關(guān)文章

  • C++中對象與類的詳解及其作用介紹

    C++中對象與類的詳解及其作用介紹

    這篇文章主要介紹了C++中對象與類的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語言文件復(fù)制實(shí)例詳解

    C語言文件復(fù)制實(shí)例詳解

    這篇文章主要介紹了C語言文件復(fù)制實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例

    C語言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結(jié)構(gòu)圖的創(chuàng)建與遍歷實(shí)驗(yàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn)

    vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn)

    本文主要介紹了vscode不同項(xiàng)目使用不同的插件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#中委托的基本用法總結(jié)

    C#中委托的基本用法總結(jié)

    以下是對C#中委托的基本用法進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友可以過來參考下。希望對大家有所幫助
    2013-09-09
  • Window10下安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟(圖文教程)

    Window10下安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟(圖文教程)

    很多和同學(xué)們在接觸c語言的時(shí)候都是使用VS,本文主要介紹了Window10下如何安裝VS2022社區(qū)版的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C語言一篇精通鏈表的各種操作

    C語言一篇精通鏈表的各種操作

    鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu),是根據(jù)需要開辟內(nèi)存單元,鏈表這種數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實(shí)現(xiàn),即一個(gè)結(jié)點(diǎn)中應(yīng)包含一個(gè)指針變量,用它存放下一結(jié)點(diǎn)的地址
    2022-04-04
  • C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別詳析

    C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別詳析

    C++中sort()和priority_queue都能自定義比較函數(shù),其中sort()自定義的比較函數(shù)比較好理解,priority_queue中自定義的比較函數(shù)的效果和sort()是相反的,這篇文章主要給大家介紹了關(guān)于C++中sort()函數(shù)和priority_queue容器中比較函數(shù)的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論