程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言學習筆記(4)

C語言學習筆記(4)

編輯:關於C語言

1. 數組大小

我相信,在C#/Java中,更多的人願意用List<T>來取代數組,一方面是List提供了較多的方法,另一方面也無需我們去指定數組的大小。

那麼在C語言中,我們既然需要必須指定數組的大小,而一般來講,很多數組大小事我們無法確定並且經常會發生變化的,那麼我們最好的方式就是用宏定義來限定數組的大小。

  1. #define SIZE 10  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE];  

 

如果包含多個數組的話,用宏就很難記憶,那麼我們就可以利用sizeof運算符。

  1. int main (void)  
  2. {  
  3.     int a[]={1,3,4,55,6,7,89,9,0};  
  4.     int i ;  
  5.     printf("%d",(int)sizeof(a)/(int)sizeof(a[0]));  
  6.     for(i=0;i<(int)sizeof(a)/(int)sizeof(a[0]);i++)  
  7.     {  
  8.         a[i]=0;  
  9.     }  
  10.     for(i=0;i<(int)sizeof(a)/(int)sizeof(a[0]);i++)  
  11.     {  
  12.         printf("%d\n",a[i]);  
  13.     }  

注意,我們之前說過,sizeof返回的值是size_t,因此,我們在計算時,最好將其先強制類型轉換為我們可以控制的類型。

 

2. 數組初始化

一般情況下,我們初始化數組都是把整數數組初始化為0,那麼我們一般會怎麼做呢?

  1. #define SIZE 5  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE]={0,0,0,0,0};  

 

那麼如過SIZE=100怎麼辦,那麼很多人都會這樣去做。

  1. #define SIZE 100  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE];  
  6.     int i ;  
  7.     for(i=0;i<SIZE;i++)  
  8.     {  
  9.         a[i]=0;  
  10.     }  

 

其實我們完全不用麻煩,這麼一句代碼就可以搞定了。

  1. #define SIZE 100  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE]={0};  

 

在C99中,提供了一種初始化式,使得我們可以這樣來寫。

  1. #define SIZE 100  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE]={[5]=100,[50]=49};  

 

而其他的數字就都默認為0。那麼我們來考慮這樣一段代碼:

  1. #define SIZE 10  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE]={1,2,3,4,5,[0]=6,7,8};  

那麼在C99中,這段代碼的結果究竟是什麼呢?這個就需要我們來了解一下數組初始化式的原理。

其實,編譯器在初始化式數組列表時,都會記錄下一個待初始化的元素的位置,比如說在初始化index=0的元素時,會記錄下1,這樣以此類推,但是當初始化index=5的時候,首先根據他的初始化式記錄下一個待初始化的元素時index=1,然後初始化index=0的元素為6。那麼也就是說:最後的結果應該是{6,7,8,4,5,0,0,0,0,0}。

3. 常量數組

當數組加上const就變成了常量數組,常量數組主要有兩個好處。

1. 告訴使用者,這個數組是不應該被改變的。

2. 有助於編譯器發現錯誤。

4. C99的變長數組

這是個很爽的東西,我們再也不必擔心為數組指定大小而發愁了,指定大了會造成空間的浪費,指定小了又不夠用。

在C99中,他的長度會由程序執行時進行計算。

方式如下:

  1. int main (void)  
  2. {  
  3.     int size;  
  4.     int a[size];  
  5.     scanf("%d",&size);  

 

5. 數組的復制

很多時候,我們需要把一個數組的元素復制到另一個數組上,我們大多數人第一個想到的就是循環復制。

  1. #define SIZE 10  
  2.  
  3. int main (void)  
  4. {  
  5.     int a[SIZE];  
  6.     int b[SIZE];  
  7.     int i ;  
  8.     for(i=0;i<SIZE;i++)  
  9.     {  
  10.         a[i]=i;  
  11.     }  
  12.     for(i=0;i<SIZE;i++)  
  13.     {  
  14.         b[i]=a[i];  
  15.     }  
  16.     for(i=0;i<SIZE;i++)  
  17.     {  
  18.         printf("%d",b[i]);  
  19.     }  

 

其實還有一種更好的方法是使用memcpy方法,這是一個底層函數,它把內存的字節從一個地方復制到另一個地方,效率更高。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.  
  5. #define SIZE 10  
  6.  
  7. int main (void)  
  8. {  
  9.     int a[SIZE];  
  10.     int b[SIZE];  
  11.     int i ;  
  12.     for(i=0;i<SIZE;i++)  
  13.     {  
  14.         a[i]=i;  
  15.     }  
  16.     memcpy(b,a,sizeof(a));  
  17.     for(i=0;i<SIZE;i++)  
  18.     {  
  19.         printf("%d",b[i]);  
  20.     }  

 

 

 

本文出自 “kym” 博客,請務必保留此出處http://kymsha.blog.51cto.com/647951/290505

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved