在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

指數指針的相關知識

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

周立功教授數年之心血之作《程序設計與數據結構》,書本內容公開后,在電子行業掀起一片學習熱潮。經周立功教授授權,本公眾號特對本書內容進行連載,愿共勉之。

第一章為程序設計基礎,本文為1.8.3 指針數組。

>>>>1.字符串與指針數組

如果有以下定義:

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

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

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

int data0, data1, data2;

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

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

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

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

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

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

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

圖 1.14 存址方式

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

圖 1.15 存值方式

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

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

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

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

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

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

byte_swap()數據交換函數的接口與實現詳見程序清單 1.42和程序清單 1.43。

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

1 #pragma once

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

程序清單1.43swap數據交換函數接口的實現(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 }

針對特定的字符串,指針數組的應用示例詳見程序清單 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數據

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 }

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70585

原文標題:周立功:你知道數組也能保存指針嗎?

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言指針知識科普

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

    經典著作《C和指針

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

    基礎知識講解:LED色溫和顯色指數的介紹

    要想了解LED照明,就必須了解LED色溫。所以每個LED產品設計者都必須先接觸LED色溫的相關知識。LED色溫的重要性足以影響產品的銷售,只有符合標準的色溫才能創造舒適的照明環境,本文介紹的就是LED色溫和顯色指數的基礎
    發表于 11-05 08:03 ?1w次閱讀

    C語言基礎教程之指針知識點和使用總結

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

    C和指針課后題答案完整版免費下載

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

    理解函數指針、函數指針數組、函數指針數組的指針

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

    C和指針的電子書免費下載

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

    043-ACMICPC相關知識

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

    總降調度相關知識

    總降調度相關知識(開關電源技術與設計潘pdf)-總降調度相關知識? ? ? ? ? ? ? ? ? ?
    發表于 09-23 16:33 ?8次下載
    總降調度<b class='flag-5'>相關</b><b class='flag-5'>知識</b>

    指針才是C語言的精髓

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

    數組相關的雙指針算法

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

    C語言_字符串與指針的練習

    這篇文章涉及到字符串與指針知識點的相關練習。浮點數與字符串互轉、字符串拷貝、字符串比較、指針交換變量、指針優先級、數據類型強制轉換、內存拷貝
    的頭像 發表于 08-14 09:51 ?1507次閱讀

    C語言中指針及其相關知識

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

    晶體知識——晶向指數和晶面指數

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

    母線保護相關知識分享

    母線保護相關知識分享
    的頭像 發表于 01-19 10:29 ?585次閱讀
    母線保護<b class='flag-5'>相關</b><b class='flag-5'>知識</b>分享
    主站蜘蛛池模板: 西西人体44rt高清午夜| 亚洲午夜视频| 欧美一区二区视频三区| 狠婷婷| 新版天堂资源中文在线| 国产综合久久久久影院 | 精品午夜久久影视| 福利视频999| 免费一级e一片在线播放| 午夜美女视频在线观看高清| a毛片免费观看完整| 黑人边吃奶边扎下面激情视频| 欧美综合国产精品日韩一| 四虎永久免费网站免费观看| 国产三级日本三级日产三级66| 午夜视频免费在线观看| 台湾一级毛片| 天堂中文网| 国产精品久久久久久久久久影院| 日本人六九视频69jzz免费| 午夜免费啪啪| 日本一区视频在线播放| 无人码一区二区三区视频| 好黄好猛好爽好痛的视频| 高清一级毛片一本到免费观看| 狼狼鲁狼狼色| 激情六月丁香| 国产成人精品三级在线| 中文字幕在线天堂| 中文字幕日韩三级| 色月| 女人午夜啪啪性刺激免费看| 开心激情五月网| 黄色一级一毛片| 国产视频一区二区在线观看| 国产精品国产主播在线观看| 国产成人优优影院| 成人看片在线观看| 最新欧美一级视频| 天天躁狠狠躁| 免费午夜视频|