那曲檬骨新材料有限公司

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

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

3天內不再提示

周立功教你學C語言編程:教你數組是如何保存指針的

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:電子大兵 ? 2017-08-31 10:09 ? 次閱讀

第一章為程序設計基礎,本文為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 }

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

    關注

    180

    文章

    7614

    瀏覽量

    137712
  • 指針
    +關注

    關注

    1

    文章

    481

    瀏覽量

    70609
  • C語言編程
    +關注

    關注

    6

    文章

    90

    瀏覽量

    21149
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37749
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    26028

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

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

收藏 人收藏

    評論

    相關推薦

    立功教你C語言編程與程序設計:這樣寫函數指針數組最好用

    立功教授數年之心血之作《程序設計與數據結構》以及《面向AMetal框架與接口的編程(上)》,電子版已無償性分享到電子工程師與高校群體,在公眾號回復【編程】即可在線閱讀。
    的頭像 發表于 08-31 14:06 ?6999次閱讀
    <b class='flag-5'>周</b><b class='flag-5'>立功</b><b class='flag-5'>教你</b><b class='flag-5'>學</b><b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>編程</b>與程序設計:這樣寫函數<b class='flag-5'>指針</b><b class='flag-5'>數組</b>最好用

    所有C語言數組指針的知識都在這里了!|立功手把手教你C語言編程

    數組作為函數的參數時,C語言函數的所有參數必須在函數內部聲明。但是,由于在函數內部并沒有給數組分配新的存儲空間,因此一維數組的容量只在主程
    的頭像 發表于 09-01 09:28 ?8279次閱讀

    立功手把手教你C語言編程:用數組,構造一個雙重指針

    第一章為程序設計基礎,本文為1.8.3 指針數組中的第二要點:字符串與指針指針、第三要點: 字符串與二維數組
    的頭像 發表于 09-04 14:15 ?6677次閱讀

    《手把手教你單片機c語言》視頻教程

    `《手把手教你單片機C語言》視頻教程電驢、優酷、迅雷等下載地址《手把手教你單片機
    發表于 10-26 14:14

    《手把手教你CPLD/FPGA與單片機聯合設計》-興華

    。此外,為了幫助讀者掌握單片機與CPLD/FPGA的聯合設計,還介紹了51單片機的基本知識及單片機c語言編程的基礎知識,并通過實例設計進行詳解。《手把手教你
    發表于 12-29 17:10

    《手把手教你CPLD/FPGA與單片機聯合設計》-興華

    。此外,為了幫助讀者掌握單片機與CPLD/FPGA的聯合設計,還介紹了51單片機的基本知識及單片機c語言編程的基礎知識,并通過實例設計進行詳解。《手把手教你
    發表于 01-06 17:21

    手把手教你PIC單片機C語言

    手把手教你PIC單片機C語言教程第1課- PICHL-K18- PICHL-K18慧凈電子--做人人都買得起的PPIICC單片機開發板真誠為你服務,基于HHLL--KK1188 開發
    發表于 07-15 09:23

    指針數組

    手把手教你C語言難點編程,很好的C語言編程基礎資料,
    發表于 03-25 15:30 ?1次下載

    吳堅鴻教你C語言

    《吳堅鴻教你C語言》這一套資料是我根據吳堅鴻先生連載的“[51單片機] 從業將近十年!手把手教你單片機程序框架”,我覺得對一些初學者甚至是
    發表于 05-25 10:51 ?0次下載

    神2也教你E語言

    語言是一門以中文作為程序代碼編程語言學習例程:易語言-神2也教你E
    發表于 06-06 17:36 ?2次下載

    TinyM0_tools.pdf立功官方文件 教你怎么下載 很不錯

    TinyM0_tools.pdf立功官方文件 教你怎么下載 很不錯
    發表于 10-13 15:14 ?15次下載
    TinyM0_tools.pdf<b class='flag-5'>周</b><b class='flag-5'>立功</b>官方文件 <b class='flag-5'>教你</b>怎么下載 很不錯

    手把手教你LabVIEW視覺設計

    手把手教你LabVIEW視覺設計手把手教你LabVIEW視覺設計手把手教你LabVIEW視
    發表于 03-06 01:41 ?3183次閱讀

    C語言指針數組的區別

    C語言教程中我們使用通過數組名通過偏移和指針偏移都可以遍歷數組,那么指針
    的頭像 發表于 07-18 16:29 ?1985次閱讀

    C語言進階】“數組指針”和“指針數組”都是啥跟啥?

    C語言進階】“數組指針”和“指針數組”都是啥跟啥?
    的頭像 發表于 08-31 13:21 ?1952次閱讀

    C語言中什么是指針數組

    C語言中一個數組,若其元素均為指針類型數據,稱為指針數組,也就是說,
    的頭像 發表于 03-10 15:26 ?1872次閱讀
    送彩金百家乐官网平台| 大发888娱乐85战神版| 百家乐官网神仙道官网| 迷你百家乐的玩法技巧和规则| 百家乐官网电投网站| 网络百家乐赌博视频| 百家乐官网洗码软件| 太阳百家乐网址| 百家乐官网澳门赌| 新锦江百家乐的玩法技巧和规则 | 祁连县| 现场百家乐能赢吗| 电玩城百家乐官网技巧| 真人百家乐免费送钱| 百家乐官网电子路单谁| 沙龙网上娱乐| 真人百家乐游戏软件| 巴黎人百家乐官网的玩法技巧和规则 | 百家乐官网单注技巧| 全讯网hg055.com| 百家乐最新赌王| 百家乐官网庄闲出现几率| 大发888宫网| 百家乐翻天粤| 里尼的百家乐官网策略| 足球比分| 大上海百家乐的玩法技巧和规则 | 金花百家乐的玩法技巧和规则| 大集汇百家乐官网的玩法技巧和规则| 阳原县| 大发888娱乐场下载zhidu| 将军百家乐官网的玩法技巧和规则 | 网上百家乐玩法| 网上百家乐官网有假的吗| 博彩吧| 百家乐在线赌场娱乐网规则| 百家乐官网筹码套装100片| 百家乐官网怎样做弊| 百家乐号公| 百家乐能赚大钱吗| 鑫鼎百家乐官网娱乐城|