0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

指數(shù)指針的相關(guān)知識

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:佚名 ? 2017-09-14 13:59 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,書本內(nèi)容公開后,在電子行業(yè)掀起一片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號特對本書內(nèi)容進(jìn)行連載,愿共勉之。

第一章為程序設(shè)計(jì)基礎(chǔ),本文為1.8.3 指針數(shù)組。

>>>>1.字符串與指針數(shù)組

如果有以下定義:

int data0 = 1, data1 = 2, data2 = 3;

int *ptr0 = &data0, *ptr1 = &data1, *ptr2 = &data2;

實(shí)際上地址也是數(shù)據(jù),那么數(shù)組也可以保存指針,因此可以在基本數(shù)據(jù)類型的基礎(chǔ)上派生一個構(gòu)造類型,即將相同類型的指針變量集合在一起有序地排列構(gòu)成指針數(shù)組。在指針數(shù)組變量的每一個元素中存放一個地址,并用下標(biāo)區(qū)分它們。雖然數(shù)組與指針數(shù)組存儲的都是數(shù)據(jù),但還是有細(xì)微的差別。數(shù)組存儲的是相同類型的字符或數(shù)值,而指針數(shù)組存儲的是相同類型的指針。比如:

int data0, data1, data2;

int *ptr[3] = {&data0, &data1, &data2};

該聲明被解釋為ptr是指向int的指針的數(shù)組(元素個數(shù)3),“int *[3]”類型名被解釋為指向int的指針的數(shù)組(元素個數(shù)3)類型。即ptr指針數(shù)組是數(shù)組元素為3個指針的數(shù)組,其本質(zhì)是數(shù)組,類型為int *[3],ptr[0]指向&data0,ptr[1]指向&data1,ptr[2]指向&data2。

由于ptr聲明為指針數(shù)組,因此ptr[0]返回的是一個地址。當(dāng)用*ptr[i]解引用指針(i=0~2)時,則得到這個地址的內(nèi)容,即*ptr[0]==1,*ptr[1]==2,*ptr[2]==3。當(dāng)然,也可以使用等價的指針表示法,ptr+i表示數(shù)組第i個元素的地址。如果要修改這個地址中的內(nèi)容,可以使用*(ptr+i)。如果對**(ptr+i)解引用兩次,則返回所分配的內(nèi)存的位置,即可對其賦值。比如,ptr[1]位于地址&ptr[1],表達(dá)式ptr+1返回&ptr[1],用*(ptr+1)則得到指針&data1,再用**(ptr+i)解引用得到&data1的內(nèi)容“1”。由此可見,使用指針的指針表示法,讓我們知道正在處理的是指針數(shù)組。

顯然,只要初始化一個指針數(shù)組變量保存各個字符串的首地址,即可引用多個字符串:

char * keyWord[5] = {"eagle", "cat", "and", "dog", "ball"};

其中,keyWord[0]的類型是char*,&keyWord[0]的類型是char **。雖然這些字符串看起來好像存儲在keyWord指針數(shù)組變量中,但指針數(shù)組變量中實(shí)際上只存儲了指針,每一個指針都指向其對應(yīng)字符串的第一個字符。也就是說,第i個字符串的所有字符存儲在存儲器中的某個位置,指向它的指針存儲在keyWord [i]中,即keyWord [0]指向“"eagle"”、keyWord [1]指向“"cat"”,keyWord[2]指向 "ant",keyWord[3]指向 "dog",keyWord[4]指向 "ball"。

盡管keyWord的大小是固定的,但它訪問的字符串可以是任意長度,這種靈活性是C語言強(qiáng)大的數(shù)據(jù)構(gòu)造能力的一個有力的證明。由于指針數(shù)組是元素為指針變量的數(shù)組,因此一個字符指針數(shù)組可以用于處理多個字符串。顯然,將字符串制成一個表存放于指針數(shù)組的話,比使用switch語句效果更好。由此可見,數(shù)據(jù)的隨機(jī)存儲會以兩種形式保存:存址和存值,存址方式詳見圖 1.14。一個數(shù)組包含了指向?qū)嶋H信息的指針,而不是直接將信息存儲在數(shù)組元素的存儲空間里。使用這種方式,可以靈活地存儲和排序任何復(fù)雜結(jié)構(gòu)的數(shù)據(jù)。

圖 1.14 存址方式

相反地,基于值的存儲將n個元素的數(shù)據(jù)集合打包存儲在固定大小的記錄塊中,這個固定大小為s,存值方式詳見圖 1.15,每個字符串占用大小為6字節(jié)的連續(xù)存儲塊。

圖 1.15 存值方式

為了便于說明多個字符串的引用,將設(shè)計(jì)一個數(shù)據(jù)交換函數(shù)。由于任何數(shù)據(jù)類型的指針都可以給void*指針賦值,因此可以利用這一特性,將void*指針作為byte_swap()函數(shù)的形參,即可接受任何類型數(shù)據(jù)。

由于C中最小長度的變量為char類型(包括unsigned char、signed char等),其sizeof(char)的結(jié)果為1,而其它任何變量的長度都是它的整數(shù)倍。比如,在32位系統(tǒng)中,sizeof(int)為4。由于C語言的變量類型多種多樣,因此不可能為每一種變量類型編號,而且swap也并不關(guān)心變量的真正類型,所以可以用變量的長度代替變量類型。byte_swap函數(shù)原型為:

void byte_swap(void *pData1, void *pData2, size_t stSize);

其中,size_t是C語言標(biāo)準(zhǔn)庫中預(yù)定義的類型,專門用于保存變量的大小。stSize為變量的長度,pData1、pData2分別為是要比較的第1、2個參數(shù)。當(dāng)返回值< 0時,表示pData1 < pData2;當(dāng)返回值= 0時,表示pData1 = pData2;當(dāng)返回值> 0時,表示pData1 > pDta2。

在這里,任何類型的指針都可以傳入byte_swap()中,真實(shí)地體現(xiàn)了內(nèi)存操作函數(shù)的意義,無論這塊內(nèi)存是什么數(shù)據(jù)類型,它操作的對象僅僅是一塊內(nèi)存。無論用戶傳進(jìn)來的是什么類型,從C99版本后,將void *類型指針賦值給其它類型指針時,不再需要強(qiáng)制類型轉(zhuǎn)換。即循環(huán)一次交換一個字節(jié),那么對于int類型數(shù)據(jù)來說,僅需循環(huán)4次就可以了。其前提是兩個變量的類型必須相同,比如,交換a、b兩個變量的值,其使用方法如下:

byte_swap(&a, &b, sizeof(a));

byte_swap()數(shù)據(jù)交換函數(shù)的接口與實(shí)現(xiàn)詳見程序清單 1.42和程序清單 1.43。

程序清單1.42swap數(shù)據(jù)交換函數(shù)接口(swap.h)

1 #pragma once

2 void byte_swap(void *pData1, void *pData2, size_t stSize);

程序清單1.43swap數(shù)據(jù)交換函數(shù)接口的實(shí)現(xiàn)(swap.c)

1 void byte_swap(void *pData1, void *pData2, size_t stSize)

2 {

3 unsigned char *pcData1 = pData1;

4 unsigned char *pcData2 = pData2;

5 unsigned char ucTemp;

6

7 while (stSize--){

8 ucTemp = *pcData1; *pcData1 = *pcData2; *pcData2 = ucTemp;

9 pcData1++; pcData2++;

10 }

11 }

針對特定的字符串,指針數(shù)組的應(yīng)用示例詳見程序清單 1.44。

程序清單1.44比較字符串大小然后輸出范例程序

1 #include

2 #include

3 #include "swap.h"

4

5 const char * keyWord[5] = {"eagle", "cat", "and", "dog", "ball"};

6 void show_str (void) //打印keyWord數(shù)據(jù)

7 {

8 for (int i = 0; i < sizeof(keyWord) / sizeof(keyWord[0]); i ++){

9 printf("%s", keyWord[i]);

10 }

11 printf("\n");

12 }

13

14 int main(int argc, char *argv[])

15 {

16 show_str();

17

18 if(strcmp(keyWord[0], keyWord[1]) < 0)

19 byte_swap(keyWord, keyWord +1, sizeof(keyWord[0]));

20 show_str();

21 return 0;

22 }

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    475

    瀏覽量

    70457

原文標(biāo)題:周立功:你知道數(shù)組也能保存指針嗎?

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    C語言指針知識科普

    指針是C語言最重要也是最難理解的部分,它在我們平時的工作中無處不在。
    發(fā)表于 09-26 10:26 ?428次閱讀

    經(jīng)典著作《C和指針

    《C和指針》提供與C語言編程相關(guān)的全面資源和深入討論?!禖和指針》通過對指針的基礎(chǔ)知識和高級特性的探討,幫助程序員把
    發(fā)表于 11-26 10:17

    基礎(chǔ)知識講解:LED色溫和顯色指數(shù)的介紹

    要想了解LED照明,就必須了解LED色溫。所以每個LED產(chǎn)品設(shè)計(jì)者都必須先接觸LED色溫的相關(guān)知識。LED色溫的重要性足以影響產(chǎn)品的銷售,只有符合標(biāo)準(zhǔn)的色溫才能創(chuàng)造舒適的照明環(huán)境,本文介紹的就是LED色溫和顯色指數(shù)的基礎(chǔ)
    發(fā)表于 11-05 08:03 ?9366次閱讀

    C語言基礎(chǔ)教程之指針知識點(diǎn)和使用總結(jié)

    指針是一種特殊的變量。它的特殊性表現(xiàn)在哪些地方呢?由于指針是一種變量,它就應(yīng)該具有變量的三要素:名字、類型和值。于是指針的特殊性就應(yīng)表現(xiàn)在這蘭個要素上。指針的名字與一般變量的規(guī)定相同,
    發(fā)表于 11-13 17:55 ?6次下載
    C語言基礎(chǔ)教程之<b class='flag-5'>指針</b>的<b class='flag-5'>知識</b>點(diǎn)和使用總結(jié)

    C和指針課后題答案完整版免費(fèi)下載

    本書提供與C語言編程相關(guān)的全面資源和深入討論。本書通過對指針的基礎(chǔ)知識和高級特性的探討,幫助程序員把指針的強(qiáng)大功能融入到自己的程序中去。
    發(fā)表于 11-13 08:47 ?0次下載

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組的指針

    理解函數(shù)指針、函數(shù)指針數(shù)組、函數(shù)指針數(shù)組的指針
    的頭像 發(fā)表于 06-29 15:38 ?1.5w次閱讀
    理解函數(shù)<b class='flag-5'>指針</b>、函數(shù)<b class='flag-5'>指針</b>數(shù)組、函數(shù)<b class='flag-5'>指針</b>數(shù)組的<b class='flag-5'>指針</b>

    C和指針的電子書免費(fèi)下載

    本書提供與C語言編程相關(guān)的全面資源和深入討論。本書通過對指針的基礎(chǔ)知識和高級特性的探討,幫助程序員把指針的強(qiáng)大功能融入到自己的程序中去。
    發(fā)表于 03-22 16:06 ?98次下載

    043-ACMICPC相關(guān)知識

    043-ACMICPC相關(guān)知識(開關(guān)電源中高壓電容怎么選擇)-ACMICPC相關(guān)知識;ACMICPC相關(guān)
    發(fā)表于 07-26 11:56 ?12次下載
    043-ACMICPC<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識</b>

    總降調(diào)度相關(guān)知識

    總降調(diào)度相關(guān)知識(開關(guān)電源技術(shù)與設(shè)計(jì)潘pdf)-總降調(diào)度相關(guān)知識? ? ? ? ? ? ? ? ? ?
    發(fā)表于 09-23 16:33 ?8次下載
    總降調(diào)度<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識</b>

    指針才是C語言的精髓

    文章目錄前言一、pandas是什么?二、使用步驟1.引入庫2.讀入數(shù)據(jù)總結(jié)前言指針對于很多初學(xué)C語言的人來說是一個十分復(fù)雜比較抽象的知識,今天就帶大家一起來揭開指針的神秘面紗。提示:以下是本篇
    發(fā)表于 12-09 13:06 ?14次下載
    <b class='flag-5'>指針</b>才是C語言的精髓

    數(shù)組相關(guān)的雙指針算法

    對于單鏈表來說,大部分技巧都屬于快慢指針,前文 單鏈表的六大解題套路 都涵蓋了,比如鏈表環(huán)判斷,倒數(shù)第K個鏈表節(jié)點(diǎn)等問題,它們都是通過一個fast快指針和一個slow慢指針配合完成任務(wù)。
    的頭像 發(fā)表于 04-28 16:22 ?1832次閱讀

    C語言_字符串與指針的練習(xí)

    這篇文章涉及到字符串與指針知識點(diǎn)的相關(guān)練習(xí)。浮點(diǎn)數(shù)與字符串互轉(zhuǎn)、字符串拷貝、字符串比較、指針交換變量、指針優(yōu)先級、數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換、內(nèi)存拷貝
    的頭像 發(fā)表于 08-14 09:51 ?1383次閱讀

    C語言中指針及其相關(guān)知識

    數(shù)組在內(nèi)存中只是數(shù)組元素的簡單排列,沒有開始和結(jié)束標(biāo)志,在求數(shù)組的長度時不能使用指針p來sizeof(p) / sizeof(int)這樣來求,因?yàn)?p 只是一個指向 int 類型的指針,編譯器
    的頭像 發(fā)表于 10-14 16:23 ?768次閱讀

    晶體知識——晶向指數(shù)和晶面指數(shù)

    "在材料科學(xué)中討論有關(guān)晶體的生長、變形、相變及性能等問題時,常需涉及晶體中原子的位置、原子列的方向(稱為晶向)和原子構(gòu)成的平面(稱為晶面)。為了便于確定和區(qū)別晶體中不同方位的晶向和晶面,國際上通常用米勒指數(shù)(Miller indices)來統(tǒng)一標(biāo)定晶向指數(shù)和晶面
    的頭像 發(fā)表于 11-13 14:34 ?1.3w次閱讀
    晶體<b class='flag-5'>知識</b>——晶向<b class='flag-5'>指數(shù)</b>和晶面<b class='flag-5'>指數(shù)</b>

    母線保護(hù)相關(guān)知識分享

    母線保護(hù)相關(guān)知識分享
    的頭像 發(fā)表于 01-19 10:29 ?368次閱讀
    母線保護(hù)<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識</b>分享