讀古今文學網 > C語言解惑 > 2.8 一維數組更要特殊對待 >

2.8 一維數組更要特殊對待

字符串也是一維數組,但它很特殊,所以這裡說的一維數組不包含它,而是指數字數組,即整數數組和實數數組,也就是數值數組。如果抄襲字符串的形式來輸出數組的全部內容,有可能會寫出如下的錯誤程序。


#include <stdio.h>
void main 
( 
)
{   
  int a[3]={1
,2
,3}
;
  printf
("%d\n"
,a
);
}
  

這個程序本身是正確的,問題是它輸出的內容不符合要求。字符串可以使用printf函數一次輸出,但數值數組只能一次一個地輸出。上述程序中使用的printf語句格式輸出的不是數組的內容,而是數組存儲的首地址。a的內容必須一個一個地輸出,即


printf
("%d "
,a[0]
);  printf
("%d "
,a[1]
);  printf
("%d "
,a[2]
);
  

可以使用如下循環語句的形式輸出:


for
(i=0
;i<3
;i++
)
    printf
("%d "
,a[i]
);
  

【例2.11】下面程序輸出的是數組的內容嗎?


#include <stdio.h>
void main 
( 
)
{   
  int a[3]={1
,2
,3}
;
  int i=0
;
  for
(i=0
;i<3
;i++
)
     printf
("%d "
,&a[i]
);
  printf
("%d\n"
,a
);
}
  

這個程序不是輸出數組的內容。因為在for循環語句


for
(i=0
;i<3
;i++
)
      printf
("%d "
,&a[i]
);
  

中,&a[i]表示數組各個元素的地址。i=0時,&a[0]和a一樣,均表示數組a的首地址,所以語句


printf
("%d "
,&a[0]
);
  

和語句


printf
("%d "
,a
);
  

的輸出內容是相同的。隨著i的變化,&a[i]將分別對應數組a的各個元素的地址。程序輸出內容如下:


1245044 1245048 1245052 1245044
  

正如分析的一樣,第1項和第4項的輸出相同。

輸出內容應使用數組元素的名字a[i],即


for
(i=0
;i<3
;i++
)
    printf
("%d "
,a[i]
);
  

如果先定義數組,如何為數組元素賦值呢?scanf要求的是存儲元素的地址。普通變量是在變量前加「&」號,數組元素的標記也是使用「&」號,所以可以一個一個地賦值。

【例2.12】使用scanf語句為數組賦值的例子。


#include <stdio.h>
void main 
( 
)
{   
     int a[3]
,i
;
     printf
("
輸入數組內容:"
);
     for
(i=0
;i<3
;i++
)
          scanf
("%d"
,&a[i]
);
     printf
("
輸出數組內容:"
);
     for
(i=0
;i<3
;i++
)
          printf
("%d "
,a[i]
);
     printf
("\n"
);
 }
  

程序運行示範如下。


輸入數組內容:
3 5 7
輸出數組內容:3 5 7