C語言-數組和指標

來源:互聯網
上載者:User

數組有一系列相同的元素構成。使用數組聲明來告訴編譯器需要一個數組。數值聲明包括數組元素的數目和元素的類型。

要訪問數組中的元素可以使用下標(index)來表示單個元素,index是從0開始計數的

 

數組的初始化:

比如

days[12]={31,29,31,30,31,30,31,31,30,31,30,31}

 

如果數組沒有初始化

比如

int no_data[4]

當列印出數組元素時,數組的值是不定的。因為編譯器使用的數值是儲存單元中已有的數值。

 

初始化列表中的元素數目應該和數組大小一致。如果二者不一致:

1.比如當數值數目少於數組元素數目時,多餘的數組元素被初始化為0。例子如下:

 1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 int some_data[SIZE]={1492,1066};
6 int i;
7 printf("%2s%14s\n","i","some_data[i]");
8 for(i=1;i<SIZE;i++)
9 printf("%2d%14d\n",i,some_data[i]);
10 return 0;
11 }

output:

 i  some_data[i]
1 1066
2 0
3 0

2.如果初始化列表中項目的個數大於數組大小,編譯器會認為這個一個錯誤。程式就無法運行。

 

可以省略括弧中的數字,從而讓編譯器自動匹配數組的大小和初始化列表中的項目數目

 1 #include <stdio.h>
2 int main(void)
3 {
4 const int days[]={31,28,31,30,31,30,31,31,30,31};
5 /*const:
6 有時需要使用唯讀數組,也就是程式從數組中讀取數值,但是程式不想數組中寫入資料。在這種情況下,可以使用關鍵字const。這樣,程式會把數組中的每個元素當成常量來處理。用const聲明之後不能再對它賦值*/
7 int index;
8 /*運算子sizeof給出其後的對象或類型的大小(以byte為單位)*/
9 for(index=0;index<sizeof days/sizeof days[0];index++)
10 printf("Monsth %2d has %d days.\n",index+1,days[index]);
11 return 0;
12 }

 

 

多維陣列

多維陣列是數組的數組。比如5年中每月的降水用float rain[5][12]來表示。可以解釋為rain具有5個元素,並且每個元素都是包含12個float數值的數組。

用二維視圖表示數組可以直觀的想象兩個索引的數組。實際上,數組是順序儲存的,前12個元素之後,耕者就是第二個包含23個元素的數組。

 

多維陣列的初始化要注意幾個問題:

1.比如:

const float rain[5][12]={
{4.3,4.3,1.2,3.0},
{5.2,3.0,1.6,3.5},
......
}

第一個列表中只有4個數值,則第一行只有前4個元素得到賦值,最後8個元素被預設初始化為0。如果列表中的數值多於12個,則報告錯誤,程式無法運行,而且這些數值不會影響到下一行的賦值。

2.初始化的時候也可以省略內部的花括弧,只保留最外面一對花括弧。只要保證數值的個數正確,初始化效果就是一樣的。如果數值的個數不夠,那麼在數組初始化時候,按照先後順序來逐行賦值,一次前面的元素首先得到賦值,直到後面沒有賦值的元素被初始化為0.

 

指標和數組

數組名同時也是該數組首元素的地址

 1 #include <stdio.h>
2 #define SIZE 4
3 int main(void)
4 {
5 short dates[SIZE];
6 short * pti;
7 short index;
8 double bills[SIZE];
9 double * ptf;
10
11 pti=dates; /*把數組的首地址賦給指標*/
12 ptf=bills;
13 printf("%23s %10s\n","short","double");
14 for(index=0;index<SIZE;index++)
15 printf("pointers + %d: %10p %10p\n",index,pti+index,ptf+index);
16 return 0;
17 }

output:

                  short     double
pointers + 0: 0028FF0C 0028FEE8
pointers + 1: 0028FF0E 0028FEF0
pointers + 2: 0028FF10 0028FEF8
pointers + 3: 0028FF12 0028FF00

在上面的例子中,對一個指標加1的結果是對該指標增加一個儲存單元。

因為在C語言中:對一個指標加1的結果是對該指標增加一個儲存單元(也就是說:對指標加1,等價於對指標的值加上它指向的對象的位元組大小)。對數組而言,地址會增加到下一個元素的地址,而不是下一個位元組。

比如: *(days+index)和days[index]等價

 

//未完成

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.