亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        C/C++中指針編程的破解*

        2022-11-10 06:40:14蘇杭麗
        計算機時代 2022年11期
        關(guān)鍵詞:數(shù)組初值等價

        蘇杭麗,李 燕,童 端

        (南京財經(jīng)大學(xué)信息工程學(xué)院,江蘇 南京 210023)

        0 引言

        指針是C/C++中的重點和難點[1-4],指針的“抽象”及使用的“靈活”讓初學(xué)者感到無從下手和無所適從。

        作者參考了大量的例題、習(xí)題以及學(xué)生上機時的各種出錯代碼后發(fā)現(xiàn):如果根據(jù)每句代碼的功能、分類成組、以組為單位重新排序,那么每個指針類題目的代碼都符合一個通用的規(guī)律,即本文歸納出的“三步法”?!叭椒ā笔且粋€好用的、通用的、易學(xué)的方法,能幫助學(xué)生快速掌握指針編程并提高代碼的一次性正確率。

        1 指針編程的“三步法”

        指針在“定義時”并不開辟存儲空間,指針只能“依附”于基本變量或數(shù)組所開辟的存儲空間。所以,在定義一個指針變量時需要定義一個“同種數(shù)據(jù)類型”的非指針量,通過給指針賦該變量所開辟空間的地址,讓指針指向該變量的空間,從而實現(xiàn)指針對此存儲空間的數(shù)據(jù)操作。也可以這樣理解:非指針量在“定義”時開辟存儲空間,該空間可以采用指針和非指針兩種方式來定位(動態(tài)開辟存儲空間除外)。將這一思路整理后再配合畫圖得出本文的指針編程三步法。

        1.1 第一步:指針變量的“定義”

        這一步需要注意的是:在定義一個指針量時,還需要定義一個同種數(shù)據(jù)類型的非指針量。非指針量定義時開辟的存儲空間是為指針量作空間準備。所以,指針變量在定義時,是與非指針量“成對”出現(xiàn)的。

        1.2 第二步:給指針“賦初值”

        給指針賦值就是讓指針指向某一存儲空間。這里的賦初值,就是在指針和非指針量定義后就可以讓指針指向非指針量所開辟的存儲空間。

        這一步需要注意的是:這里的給指針賦初值(如指針定義為int *p),是指“p 等于什么”,而不是“*p 等于什么”。p是“地址”;*p在“大多數(shù)”情況下是指“值”而非“地址”。

        以int 類型為例,說明基本變量x、一維數(shù)組a[10]、二維數(shù)組b[3][4]相對應(yīng)的指針定義、指針賦初值,以及x、a[i]、b[i][j]的地址和值的指針表示格式,見表1。

        說明:

        ⑴一維數(shù)組指針賦初值有兩種格式pp=a 或pp=&a[0],其中pp=a 是常用格式。不論一維還是二維數(shù)組,數(shù)組名代表數(shù)組的首地址。數(shù)組a 的首地址是首元素a[0]的地址&a[0],所以pp=&a[0]等價于pp=a。

        ⑵二維數(shù)組的指針定義有兩種格式,分別是二維指針格式和一維指針格式。

        ●二維指針格式,如表1 的(*p1)[4],是二維數(shù)組指針的常用定義格式。

        指針定義時帶有一個與對應(yīng)二維數(shù)組“第二維”相同的下標,任何情況下(如函數(shù)的實參、形參)的定義不可省略下標值。這種定義格式,指針與數(shù)組完全匹配,指針將按照行、列的二維模式訪問數(shù)組元素。

        ●一維指針格式,如表1 的*p2,這種定義二維數(shù)組的指針格式不常用。

        *p2 是一維模式的指針定義格式,只能按照一維的模式進行數(shù)據(jù)訪問。因此,采用一維指針格式指向二維數(shù)組,要將二維數(shù)組變形為一維(或理解為降維),然后按照一維的模式訪問數(shù)組?!岸S降為一維”通過給指針賦初值實現(xiàn),如p2=b[0]或p2=*b,達到降維的目的。然后可以按照一維的模式訪問數(shù)組b,如數(shù)組任意元素b[i][j]在變形為一維數(shù)組后,相對應(yīng)的元素離首地址p2 的位置為i*4+j,因此,b[i][j]用一維指針表示為*(p2+i*4+j)。

        p2=&b[0][0]這種賦值方式,與基本變量和一維數(shù)組一樣,直接賦某一個具體元素的地址。

        ⑶當(dāng)函數(shù)的實參和形參是指針類型,它們之間的參數(shù)傳遞與指針賦初值同理。

        當(dāng)實參和形參指針的定義格式相同時,“函數(shù)調(diào)用時實參的格式和種類”可以參考“指針實參賦初值的格式和種類”。舉例如下:

        基本變量:int x,*p;p=&x;函數(shù)形如fun(int*q),相對應(yīng)的調(diào)用格式為fun(p)或fun(&x)。

        一維數(shù)組:

        二維數(shù)組的二維指針格式:

        二維數(shù)組的一維指針格式:

        如果實參只定義了數(shù)組沒定義指針,則函數(shù)調(diào)用除指針格式外其他的格式依然成立;或者先增加一個與形參格式相同的指針實參,給實參指針賦值、依據(jù)實參指針的賦值寫出函數(shù)調(diào)用所有可能的參數(shù)格式,最后再去掉與添加的指針有關(guān)的代碼。例如參考文獻[1]第251 頁例8.14,在main 主函數(shù)中只定義了二維數(shù)組score,沒定義指針格式的實參;函數(shù)average 和search 的形參分別是一維指針和二維指針,它們都指向主函數(shù)的數(shù)組score。

        為了理解本題,我們可以在主函數(shù)中增加一個與average 函數(shù)形參float *p 格式相同的實參float *p2;增加一個與search 函數(shù)形參float (*p)[4]格式相同的實參float(*p1)[4]。main函數(shù)主要代碼相應(yīng)改為:

        如果函數(shù)average的形參定義為二維指針格式,如float (*p)[4],則函數(shù)調(diào)用為average(score),函數(shù)average定義的代碼需要相對應(yīng)地改為二維模式*(*(p+i)+j)訪問,例如可以如下改變:

        同樣,函數(shù)search 的形參也可以改為一維指針模式,如float *p,則函數(shù)定義的代碼和函數(shù)調(diào)用也需要進行相對應(yīng)的改變。

        1.3 第三步:“畫圖”

        涉及指針的問題采用畫圖的方式解決,更形象也更容易?!叭椒ā敝械漠媹D有如下約定:

        ⑴非指針量的畫圖

        用方框“□”表示基本變量或數(shù)組元素定義時開辟的存儲空間,如圖1所示。

        圖1 基本變量x定義時的圖

        當(dāng)給基本變量賦值時,例如x=5,也就是將5 放在x的方框中。

        ⑵指針的畫圖

        “三步法”中,指針的值用箭頭“指向”來表示。指針在定義時值為null,因此指針在定義時沒有箭頭,如圖2所示。

        圖2 指針p和基本變量x定義時的圖

        當(dāng)給指針賦一個變量的地址時,指針箭頭將“指向”變量的空間,如圖3。當(dāng)給指針賦另一個指針時,如p1=p2,則p1 也將“指向”p2 所指的空間,即兩個指針相等,則它們的“指向”相同。

        圖3 指針p賦初值的圖

        2 符號“等價”

        這里只觀察符號*、[]和&之間的關(guān)系,得出:*和[]相當(dāng)于“一個維度”,二者在符號效果上等價;&相當(dāng)于消掉“一個維度”。

        因為*p 和x 是定義在同一種類型下,所以*p 與x地位等價。當(dāng)*p 去掉一個維度*變?yōu)閜,x 也消掉一個維度變?yōu)?x,所以p=&x在符號關(guān)系上是等價的。

        ⑵一維數(shù)組定義和賦初值的符號關(guān)系

        *pp 與a[]在定義時等價,*pp 與a[]分別消掉一個維度,得到pp=a。

        在&a[]中,&的作用是消掉一個維度,[]表示一個維度,所以&a[]和a 在符號上是等價的,所以pp=&a[]與pp=a等價。

        ⑶二維數(shù)組定義和賦初值的符號關(guān)系

        (*p1)[]與b[][]在定義時等價,二者分別消掉兩個維度,(*p1)[]變?yōu)閜1,b[][]變?yōu)閎,所以p1=b在符號關(guān)系上是等價的。

        b[][]和*p2在定義時等價,b[][]消掉一個維度變?yōu)閎[],*p2消掉一個維度變?yōu)閜2,所以p2=b[]在符號關(guān)系上是等價的。

        *與[]都相當(dāng)于一個維度,所以*b 與b[]在符號上是等價的,所以p2=*b與p2=b[]等價。

        &相當(dāng)于抵消一個維度,所以&b[][]相當(dāng)于b[],所以p2=&b[][]與p2=b[]等價符號關(guān)系僅為了幫助記憶指針的不同賦值格式,從這個角度考慮問題沒有理論依據(jù),僅供參考和討論。

        3 舉例對比說明“三步法”的使用

        現(xiàn)以參考文獻[1]第224 頁例8.3 為例,輸入a 和b兩個整數(shù),按先大后小的順序輸出a和b。要求用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。

        ⑴代碼對比

        參考文獻[1]例8.3的代碼標行號后如下:

        將上面的代碼,按照“三步法”的步驟拎出各步的代碼行:第4、5行屬于第一步,指針與非指針的“成對”定義;第8、9行屬于第二步,指針賦初值。

        按照“三步法”的順序,將上述代碼重新排序標行號后,得到的“三步法”代碼為:

        “三步法”的前兩步“成對定義”和“賦初值”看起來非常簡單,但它是指針編程通用的入口核心代碼,讓初學(xué)者拿到題目就知道該從哪里入手、該定義哪些指針、什么時候給指針賦初值、初值應(yīng)該賦什么,可以有效解決無從下手并避免沒有給指針賦初值就開始各種指針操作等各種各樣的問題。

        ⑵畫圖對比

        按“三步法”的畫圖約定,“三步法”代碼行畫圖如圖4所示。

        圖4 三步法代碼畫圖

        swap函數(shù)執(zhí)行結(jié)束后回到main主函數(shù)繼續(xù)執(zhí)行,第9 行輸出a、b 的值,由圖4 可以看出,此時a、b 的值分別是9和5,*pointer_1、*pointer_2也是9和5。

        參考文獻[1]在第225 頁給出本題的圖示8.5。多種方法對比學(xué)習(xí)有助于開闊思維、更好地掌握知識。

        4 結(jié)束語

        “三步法”中,指針的“定義”和“賦初值”保證了指針操作“開端”的正確,第三步的“畫圖”能形象地演示指針“后續(xù)”的各種操作,因此,“三步法”對指針編程整個流程的有序、完整和正確有一定的保證,大大提高了代碼的一次性正確率。

        “三步法”有步驟、每一步有具體的要求和細節(jié)上的說明,明確了從哪里入手、每一步該做什么、該怎么做,是值得一試的指針編程方法。

        猜你喜歡
        數(shù)組初值等價
        JAVA稀疏矩陣算法
        電腦報(2022年13期)2022-04-12 00:32:38
        具非定常數(shù)初值的全變差方程解的漸近性
        一種適用于平動點周期軌道初值計算的簡化路徑搜索修正法
        JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
        電腦報(2020年24期)2020-07-15 06:12:41
        三維擬線性波方程的小初值光滑解
        n次自然數(shù)冪和的一個等價無窮大
        中文信息(2017年12期)2018-01-27 08:22:58
        尋找勾股數(shù)組的歷程
        收斂的非線性迭代數(shù)列xn+1=g(xn)的等價數(shù)列
        環(huán)Fpm+uFpm+…+uk-1Fpm上常循環(huán)碼的等價性
        具有無窮大初值的二維奇異攝動問題的漸近解
        天天鲁在视频在线观看| 亚州中文字幕乱码中文字幕| 国产一品二品精品在线| 久久精品国产亚洲av影院| 综合久久给合久久狠狠狠97色 | 亚洲乱色视频在线观看| 亚洲av午夜福利精品一区不卡| 偷看农村妇女牲交| 香蕉久久久久久久av网站| 大伊香蕉精品视频一区| 深夜福利国产精品中文字幕| 欧美又粗又长又爽做受| 国产成人无码区免费网站| 国产网友自拍亚洲av| 国产国拍精品亚洲av在线观看| 中文字幕日韩人妻不卡一区| 欧美第五页| 亚洲一区久久久狠婷婷| 国产一区二区三区精品免费av| 亚洲精品无码专区在线| 国产视频网站一区二区三区| 国产亚洲av一线观看| 人妻激情偷乱视频一区二区三区| 国产精品国产三级国产一地 | 2021国内精品久久久久精免费| 少妇一区二区三区精选| 男人添女人囗交做爰视频| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 欧美精品高清在线xxxx| 男男啪啪激烈高潮无遮挡网站网址| 久久久久久久综合综合狠狠| 91麻豆精品激情在线观看最新| 区三区久久精品水蜜桃av| 老太婆性杂交视频| 亲子乱aⅴ一区二区三区下载| 99在线无码精品秘 人口| 一区二区三区四区草逼福利视频| 亚洲码国产精品高潮在线| 毛片无遮挡高清免费久久| 久久精品一区一区二区乱码| 丰满熟女高潮毛茸茸欧洲视频|