Một mảng
được “đối xử” khác với một biến trong C. Thậm chí hai mảng có cùng kiểu và kích
thước cũng không thể tương đương nhau. Hơn nữa, không thể gán một mảng trực tiếp
cho một mảng khác. Thay vì thế, mỗi phần tử mảng phải được gán riêng lẻ tương ứng
với từng phần tử của mảng khác. Các giá trị không thể được gán cho toàn bộ một
mảng, ngoại trừ tại thời điểm khởi tạo. Tuy nhiên, từng phần tử không chỉ có thể
được gán trị mà còn có thể được so sánh.
int player1[11], player2[11];
for (i = 0; i < 11; i++)
player1[i] = player2[i];
Tương tự,
cũng có thể có kết quả như vậy bằng việc sử dụng các lệnh gán riêng lẻ như sau:
player1[0]
= player2[0];
player1[1]
= player2[1];
...
player1[10]
= player2[10];
Cấu
trúc for là cách lý tưởng để thao tác các mảng.
Ví dụ:
/*
Program demonstrates a single dimensional array */
#include
<stdio.h>
void main() {
int num[5];
int
i;
num[0] = 10;
num[1] = 70;
num[2] = 60;
num[3] = 40;
num[4] = 50;
for
(i = 0; i < 5; i++)
pirntf(“\n Number at [%d] is
%d”, i, num[i]);
}
Kết quả
của chương trình được trình bày bên dưới:
Number at [0] is 10
Number at [1] is 70
Number at [2] is 60
Number at [3] is 40
Number at [4] is 50
Ví dụ
bên dưới nhập các giá trị vào một mảng có kích thước 10 phần tử, hiển thị giá
trị lớn nhất và giá trị trung bình.
Ví dụ:
/*Input
values are accepted from the user into the array ary[10]*/
#include
<stdio.h>
void main() {
int
ary[10];
int
i, total, high;
for
(i = 0; i < 10; i++) {
printf(“\nEnter
value: %d: “, i + 1);
scanf(“%d”, &ary[i]);
}
/* Displays highest of the entered
values */
high = ary[0];
for
(i = 1; i < 10; i++) {
if
(ary[i] > high)
high = ary[i];
}
printf(“\n Highest value entered was
%d”, high);
/* Prints average of value entered for
ary[10] */
for (i = 0, total = 0; i < 10; i++)
total = total + ary[i];
printf(“\nThe average of the element of
ary is %d”, total/i);
}
Một ví
dụ về kết quả được trình bày dưới đây:
Enter value: 1: 10
Enter value: 2: 20
Enter value: 3: 30
Enter value: 4: 40
Enter value: 5: 50
Enter value: 6: 60
Enter value: 7: 70
Enter value: 8: 80
Enter value: 9: 90
Enter value: 10: 10
Highest value entered was 90
The average of the element of ary is 46
Khởi
tạo mảng
Các mảng
không được khởi tạo tự động, trừ khi mỗi phần tử mảng được gán một giá trị
riêng lẻ. Không nên dùng các mảng trước khi có sự khởi tạo thích hợp. Điều này
là bởi vì không gian lưu trữ của mảng không được khởi tạo tự động, do đó dễ gây
ra kết quả không lường trước. Mỗi khi các phần tử của một mảng chưa khởi tạo được
sử dụng trong các biểu thức toán học, các giá trị đã tồn tại sẵn trong ô nhớ sẽ
được sử dụng, các giá trị này không đảm bảo rằng có cùng kiểu như khai báo của
mảng, trừ khi các phần tử của mảng được khởi tạo một cách rõ ràng. Điều này
đúng không chỉ cho các mảng mà còn cho các biến thông thường.
Trong
đoạn mã lệnh sau, các phần tử của mảng được gán giá trị bằng các dùng vòng lặp for.
int
ary[20], i;
for(i=0;
i<20; i++)
ary[i] = 0;
Khởi tạo
một mảng sử dụng vòng lặp for có thể được thực hiện với một hằng giá trị,
hoặc các giá trị được sinh ra từ một cấp số cộng.
Một
vòng lặp for cũng có thể được sử dụng để khởi tạo một mảng các ký tự như
sau:
Ví dụ:
#include
<stdio.h>
void main() {
char alpha[26];
int
i, j;
for(i
= 65, j = 0; i < 91; i++, j++) {
alpha[j] = i;
printf(“The character now
assigned is %c\n”, alpha[j]);
}
getchar();
}
Một phần
kết quả của chương trình trên như sau:
The character now assigned is A
The character now assigned is B
The character now assigned is C
.
.
.
Chương
trình trên gán các mã ký tự ASCII cho các phần tử của mảng alpha. Kết quả
là khi in với định dạng %c, một chuỗi các ký tự được xuất ra màn hình.
Các mảng cũng có thể được khởi tạo khi khai báo. Điều này được thực hiện bằng
việc gán tên mảng với một danh sách các giá trị phân cách nhau bằng dấu phẩy (,)
đặt trong cặp dấu ngoặc nhọn {}. Các giá trị trong cặp dấu ngoặc nhọn {}
được gán cho các phần tử trong mảng theo đúng thứ tự xuất hiện.
Ví dụ:
int
deci[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
static
float rates[4] = {0.0, -2.5, 13.75,
18.0};
char
company[5] = {‘A’, ‘P’, ‘P’, ‘L’, ‘E’};
int
marks[100] = {15, 13, 11, 9}
Các giá
trị khởi tạo của mảng phải là các hằng, không thể là biến hoặc các biểu thức. Một
vài phần tử đầu tiên của mảng sẽ được khởi tạo nếu số lượng giá trị khởi tạo là
ít hơn số phần tử mảng được khai báo. Các phần tử còn lại sẽ được khởi tạo giá
trị 0. Ví dụ, trong mảng marks sau khi có sự khởi tạo như trên, bốn phần
tử đầu tiên (từ 0 đến 3) tương ứng được khởi tạo là 15, 13, 11 và 9. Các phần tử
còn lại có giá trị 0. Không thể chỉ khởi tạo các phần tử từ 1 đến 4, hoặc từ 2
đến 4, hay từ 2 đến 5 khi sự khởi tạo được thực hiện tại thời điểm khai báo.
Trong C không có khả năng lặp lại sự khởi tạo giá trị.
Trong
trường hợp sự khởi tạo là tường minh, lớp extern hoặc static, các
phần tử của mảng được đảm bảo khởi tạo là 0 (không giống lớp auto).
Không cần
thiết khai báo kích thước của mảng đang được khởi tạo. Nếu kích thước của mảng
được bỏ qua khi khai báo, trình biên dịch sẽ xác định kích thước của mảng bằng
cách đếm các giá trị đang được khởi tạo. Ví dụ, sự khai báo mảng external
sau đây sẽ chỉ định kích thước của mảng ary là 5 vì có 5 giá trị khởi tạo.
int ary[] = {1, 2, 3, 4, 5};
Đăng nhận xét