色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

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

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:電子大兵 ? 2017-09-01 09:28 ? 次閱讀

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

>>>1.6.1數組與指針

1.數組

(1)數組的聲明

我們知道,一個基本數據類型的變量只能存儲一個數據,比如:

int data = 0x64;

如果需要存儲一組int型數據呢?比如,1、2、3,則至少需要3個變量data0、data1、data2。比如:

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

由于數據的表現形式多種多樣,還有字符型和其它的數值類型,因此僅有基本數據類型是不夠的。是否可以通過基本數據類型的組合抽象構造其它的數據類型呢?答案是可以的,構造數據類型數組就是這樣產生的。

從概念的視角來看,int型整數1、2和3都是相同的數據類型,data0、data1和data2三個變量的共性是data,其差異性是下標不一樣。因此可以將data0、data1和data2抽象為一個名字,然后用下標區分這些變量的集合——data[0]、data[1]和data[2]。如果有以下聲明:

int data[3]; //解讀為data是int數組(元素個數3)

那么data[3]就成了存放3個int型數據1、2、3的data[0]、data[1]和data[2]所組成的數組,即可分別對data[0]、data[1]和data[2]賦值:

data[0] = 1, data[1] = 2, data[2] = 3;

當然,也可以按照以下方式聲明一個數組并進行初始化:

int data[3] = {1, 2, 3};

通常將data稱為數組(變量)名,data[0]、data[1]和data[2]被稱為變量。因而可以說,數組是將相同類型數據的若干變量按有序的形式組織起來,用一個名字命名,然后用下標區分這些變量的集合。

由于數組是建立在其它類型的基礎上,因此C將數組看作構造類型,在聲明數組時必須說明其元素的類型。比如,int類型的數組、float類型的數組或其它類型的數組。而其它類型也可以是數組類型,在這種情況下,創建的是數組類型的數組,簡稱數組的數組。

(2)下標與變量的值

在這里,定義了一個名為data的數組類型變量,它是由存放3個int型數據1、2、3的變量data[0]、data[1]和data[2]組成的。通常又將數組的各個變量稱為數組的元素,而數組的元素是按照順序編號的,這些元素的編號又稱為數組元素的下標。

由于有了下標,因此數組元素在內存中的位置就被唯一確定下來了。下標總是從0開始的,最后一個元素的下標為元素的個數減1(即2),data[0]叫第1個元素,data[1]叫第2個元素,data[2]叫第3個元素,也就意味著所有的元素在內存中都是連續存儲的。

直觀上,數組是由下標(或稱為索引)和值所組成的序對集合,對于每個有定義的下標都存在一個與其關聯的值,在數學上稱為映射。除了創建新數組外,大多數語言對數組只提供兩種標準操作:一個操作是檢索一個值,另一個操作是存儲一個值。

函數Create(data, size)創建一個新的具有適當大小的空數組,初始時數組的每一項都沒有定義。Retrieve操作接受一個數組data和一個下標index,如果下標合法,則該操作返回與下標關聯的值,否則產生一個錯誤。Store操作接受一個數組data、一個下標index和一個項item的集合,即項是value值的集合,有時也將值(value)稱為項(item),返回在原來數組中增加新的序對后的數組。

顯然,int系的任何常量表達式都可以作為數組元素的下標。比如:

int array[3+5]; //合法

int array['a']; //表示int array[97];

上述定義之所以合法,因為表示元素個數的常量表達式在編譯時就具有確定的意義,與變量的定義一樣明確地分配了固定大小的空間。

雖然使用符號常量增強了數組的靈活性,但如果定義采用了以下的形式:

int n = 5;

int array[n]; //非法

因為標準C認為數組元素的個數n不是常量,雖然編譯器似乎已經“看到”了n的值,但int array[n]要在運行時才能讀取變量n的值,所以在編譯期無法確定其空間大小。使用符號常量定義數組長度的正確形式如下:

#define N 10

int array[N];

即可根據實際的需要修改常量N的值。

由于數組元素下標的有效范圍為0~N-1,因此data[N]是不存在的,但C語言并不檢查下標是否越界。如果訪問了數組末端之后的元素,訪問的就是與數組不相關的內存。它不是數組的一部分,使用它肯定會出問題。C為何允許這種情況發生呢?這要歸功于C信任程序員,因為不檢查越界可以使運行速度更快,所以編譯器沒有必要檢查所有的下標錯誤。因為在程序運行之前,數組的下標可能尚未確定,所以為了安全起見,編譯器必須在運行時添加額外代碼檢查數組的每個下標值,但這樣會降低程序的運行速度。C相信程序員能編寫正確的代碼,這樣的程序運行速度更快。但并不是所有的程序員都能做到這一點,越界恰恰是初學者最容易犯的錯誤,因此要特別注意下標的范圍不能超出合理的界限。

(3)變量的地址與類型

當將變量data[0]、data[1]和data[2]作為&的操作數時,&data[0]是指向變量data[0]的指針,&data[1]是指向變量data[1]的指針,&data[2]是指向變量data[2]的指針。data[0]、data[1]和data[2]變量的類型為int,&data[0]、&data[1]和&data[2]指針的類型為int *const,即指向常量的指針,簡稱常量指針,其指向的值不可修改。比如:

int a;

int * const ptr = &a;

ptr = NULL; //試圖修改,則編譯報警

&a = NULL; //試圖修改,則編譯報警

同理,&data是指向變量data的指針,那么data是什么類型?

按照聲明變量的規約,將標識符data取出后,剩下的“int [3]”就是data的類型,通常將其解釋為由3個int組成的數組類型,簡稱數組類型。其目的是告訴編譯器需要分配多少內存?3個元素的整數數組,data類型測試程序詳見程序清單 1.20。

程序清單1.20data類型測試程序

1 #include

2

3 void f(int x);

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

5 {

6 int data[3];

7 f(data);

8 return 0;

9 }

通過編譯器提示的警告,“funtion: 'int' differ in levels of indirection from 'int [3]'”,說明數組變量data的類型為不是int而是int [3]數組類型。由于在設計C語言時,過多地考慮了開發編譯器的便利。雖然設計編譯器更方便了,卻因為概念的模糊給初學者造成了理解上的困難。實際上數組應該這樣定義:

int [3] data;

即int是與[3]結合的。&data到底是什么類型?

當data作為&的操作數時,則&data是指向data的指針。由于data的類型為int [3],因此&data是指向“int [3]數組類型”變量data的指針,簡稱數組指針。其類型為int (*)[3],即指向int [2]的指針類型。為何要用“()”將“*”括起來?

如果不用括號將星號括起來,那么“int (*)[3]”就變成了“int *[3]”,而int *[3]類型名為指向int的指針的數組(元素個數3)類型,這是設計編譯器時約定的語法規則。

&data的類型到底是不是“int (*)[3]”?其驗證程序范例詳見程序清單 1.21。

程序清單1.21&data類型測試程序

1 #include

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

3 {

4 int data[3];

5 int b = &data;

6 return 0;

7 }

通過編譯器提示的警告,“'int' differ in levels of indirection from 'int (*)[3]'”,說明&data的類型為int (*)[3]。

(4)sizeof(data)

當data作為sizeof的操作數時,其返回的是整個數組的長度。在這里,sizeof(data)的大小為12,即3個元素占用的字節數為4×3=12,系統會認為&data+1中的“1”,偏移了一個數組的大小,因此&data +1是下一個未知的存儲空間的地址(即越界)。在小端模式下,數組在內存中的存儲方式詳見圖 1.10。

1.10數組的存儲

將如何尋找相應的數組元素呢?常用的方法是通過“數組的基地址+偏移量”算出數組元素的地址。在這里,第一個元素&data[0]的地址稱為基地址,其偏移量就是下標值和每個元素的大小sizeof(int)相乘。假設數組元素&data[0] 的地址為A,且在內存中的實際地址為0x22FF74,那么&data[1]的值為:

A + 1×sizeof(int) = (unsigned int)data + 4 = 0x22FF74 + 4 = 0x22FF78

&data[2]的值為:

A + 2×sizeof(int) = (unsigned int)data + 8 = 0x22FF74 + 8 = 0x22FF7C

實際上,當在C語言中書寫data[i]時,C將它翻譯為一個指向int的指針。Data是指向data[0]的指針,data+i是指向data[i]的,因此不管data數組是什么類型,總有data+i等于data[i],于是*(data+i)等于data[i],其相應的測試范例程序詳見程序清單 1.22。

程序清單1.22變量的地址測試程序

1 #include

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

3 {

4 int data[3]= {1, 2, 3};

5 printf("%x, %x, %x, %x, %x", &data[0], &data[1], &data[2], &data, &data+1);

6 return 0;

7 }

實踐證明,雖然&data[0]與&data的類型不一樣,但它們的值相等。同時也可以看出,數組的元素是連續存儲的。如果將數組變量占用內存的大小除以數組變量中一個元素所占用空間的大小,便可得到數組元素的個數。即:

int numData = sizeof(data) / sizeof(data[0]);

當然,也可以使用宏定義計算數組元素的個數:

#define NELEMS(data) (sizeof(data) /sizeof(data[0])

當數組作為函數的參數時,C語言函數的所有參數必須在函數內部聲明。但是,由于在函數內部并沒有給數組分配新的存儲空間,因此一維數組的容量只在主程序中定義。顯然,如果函數需要得到一維數組的大小,則必須將它以函數參數的形式傳入函數中,或將它作為全局變量訪問。

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

    關注

    1

    文章

    480

    瀏覽量

    70573
  • C語言編程
    +關注

    關注

    6

    文章

    90

    瀏覽量

    21108
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37658
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25963

原文標題:周立功:C語言數組與指針詳解

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

收藏 人收藏

    評論

    相關推薦

    手把手教你單片機之AVR入門視頻教程

    第02講 AVR硬件電路設計教程_手把手教你單片機之AVR入門篇第03講 AVR開發基礎知識_手把手
    發表于 03-02 11:04

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

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

    力天手把手教你單片機視頻全集下載

    下--力天手把手教你單片機之入門篇.rarhttp://115.com/file/an9yqmx3#07.第四講.C語言基礎
    發表于 02-14 17:06

    手把手教你單片機c語言 郭天祥

    手把手教你單片機c語言》視頻教程 https://bbs.elecfans.com/forum.php?mod=viewthread&t
    發表于 06-01 22:46

    期待宋老師的《手把手教你51單片機-C語言版》

    看過宋老師的《手把手教你51單片機-C語言版》,感覺挺好的,如果有書的教材那就更完美了!
    發表于 07-17 15:43

    今天收到關于《手把手教你51單片機-C語言版》搶樓送書

    ``今天收到宋老師《手把手教你51單片機-C語言版》這本書,感覺書還不錯啊,{:12:}最近
    發表于 08-01 15:14

    手把手教你51單片機-C語言版》公布獲獎樓層

    學過其他人的教程,也可以通過這個教程來提高一下眼界,收益肯定不會少。小編推薦:《手把手教你51單片機(C語言版)》的創作,目的就是改變當前
    發表于 08-04 16:51

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

    。此外,為了幫助讀者掌握單片機與CPLD/FPGA的聯合設計,還介紹51單片機的基本知識及單片機c語言編程的基礎
    發表于 12-29 17:10

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

    。此外,為了幫助讀者掌握單片機與CPLD/FPGA的聯合設計,還介紹51單片機的基本知識及單片機c語言編程的基礎
    發表于 01-06 17:21

    【下載】手把手教你DSP:基于TMS320C55x

    過程,所有代碼都標注有詳細的中文注釋,為讀者快速熟悉并掌握DSP的開發方法和技巧提供方便。《手把手教你DSP:基于TMS320X281x
    發表于 06-02 16:40

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

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

    指針數組

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

    手把手教你如何開始DSP編程

    手把手教你如何開始DSP編程
    發表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何開始DSP<b class='flag-5'>編程</b>

    手把手教你LabVIEW視覺設計

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

    手把手教你FPGA仿真

    電子發燒友網站提供《手把手教你FPGA仿真.pdf》資料免費下載
    發表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b><b class='flag-5'>學</b>FPGA仿真
    主站蜘蛛池模板: 国产传媒18精品免费1区| 用快播看黄的网站| 亚洲人日本人jlzzy| 爱暖暖1000部免费| 免费国产在线观看| 在教室轮流被澡高H林萌| 国产在线一卡二卡| 羞羞影院午夜男女爽爽影院网站 | 男人国产AV天堂WWW麻豆| 伊人久久精品中文字幕| 黑人巨大交牲老太| 亚洲欧洲精品成人久久曰影片| 国产精品1卡二卡三卡四卡乱码| 色婷婷AV99XX| 国产精品成人影院| 午夜福利小视频400| 国产色综合色产在线视频| 甜性涩爱快播| 嘟嘟嘟WWW在线观看视频高清| 人人在线碰碰视频免费| xxx性欧美在线观看| 热综合一本伊人久久精品| 播色屋97超碰在人人| 色拍拍噜噜噜久久蜜桃| 国产精品无码中文在线AV| 亚洲精品自在线拍2019| 久久超碰色中文字幕| 91系列在线观看免费| 琪琪午夜福利免费院| 国产69精品久久久久无码麻豆 | 美丽的姑娘BD在线观看| www.av天堂网.com| 少妇第一次交换| 国产欧美另类久久久品| 野花香HD免费高清版6高清版| 浪荡受自我调教纯肉BL| CHINESE老阿姨免费视频| 污污又黄又爽免费的网站| 精品久久伊人| 99热在线播放| 脱女学小内内摸出水网站免费|