Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 4: Con trỏ và mảng - Nguyễn Thanh Hùng

Địa chỉ và giá trị của một biến

Bộ nhớ như một dãy các byte nhớ.

Các byte nhớ được xác định một cách duy nhất qua một địa chỉ.

Biến được lưu trong bộ nhớ.

Khi khai báo một biến

Chương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến. Ví dụ một biến số nguyên (int) được cấp phát 2 byte.

Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong số đó.

Địa chỉ và giá trị của một biến (tiếp)

Một biến luôn có hai đặc tính:

Địa chỉ của biến.

Giá trị của biến.

Ví dụ:

int i, j;

i = 3;

j = i + 1;

 

ppt 50 trang kimcuc 4700
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 4: Con trỏ và mảng - Nguyễn Thanh Hùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 4: Con trỏ và mảng - Nguyễn Thanh Hùng

Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 4: Con trỏ và mảng - Nguyễn Thanh Hùng
1 
TIN HỌC ĐẠI CƯƠNG  PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C BÀI 4: CON TRỎ VÀ MẢNG 
VIỆN CÔNG NGHỆ THÔNG TIN 
SCHOOL OF INFORMATION COMMUNICATION TECHNOLOGY 
Ts. Nguyễn Thanh Hùng 
2 
BÀI 4:	CON TRỎ VÀ MẢNG 
4 .1. Con trỏ và địa chỉ 
4.1.1. Tổng quan về con trỏ 
4.1.2. Các phép toán làm việc với con trỏ 
4.2. Mảng 
4.2.1. Khái niệm mảng 
4.2.2. Khai báo và sử dụng mảng 
4.2.3. Các thao tác cơ bản làm việc trên mảng 
4.3. Sử dụng con trỏ làm việc với mảng 
3 
4.1.1. Tổng quan về con trỏ 
a. Địa chỉ và giá trị của một biến 
Bộ nhớ như một dãy các byte nhớ. 
Các byte nhớ được xác định một cách duy nhất qua một địa chỉ . 
Biến được lưu trong bộ nhớ. 
Khi khai báo một biến 
C hương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến. Ví dụ một biến số nguyên (int) được cấp phát 2 byte. 
Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong số đó. 
4 
4.1.1. Tổng quan về con trỏ 
a. Địa chỉ và giá trị của một biến (tiếp) 
Một biến luôn có hai đặc tính: 
Địa chỉ của biến. 
Giá trị của biến. 
Ví dụ: 
int i, j; 
i = 3; 
j = i + 1; 
Biến 
Địa chỉ 
Giá trị 
i 
FFEC 
3 
j 
FFEE 
4 
5 
4.1.1. Tổng quan về con trỏ 
b. Khái niệm và khai báo con trỏ 
Con trỏ là một biến mà giá trị của nó là địa chỉ của một vùng nhớ. 
Khai báo con trỏ: 
Cú pháp khai báo một con trỏ như sau:	 
Kieu_du_lieu *ten_bien_con_tro; 
Ví dụ 
int i = 3; 
int *p; 
p = &i; 
Một con trỏ chỉ có thể trỏ tới một đối tượng cùng kiểu. 
Biến 
Địa chỉ 
Giá trị 
i 
FFEC 
3 
p 
FFEE 
FFEC 
6 
4.1.1. Tổng quan về con trỏ 
Toán tử & và * 
Toán tử & : Trả về địa chỉ của biến. 
Toán tử * : Trả về giá trị chứa trong vùng nhớ được trỏ bởi giá trị của biến con trỏ. 
Cả hai toán tử * và & có độ ưu tiên cao hơn tất cả các toán tử số học ngoại trừ toán tử đảo dấu. 
Ví dụ: 
void main() 
{ 
 int i = 3; int *p; 
 p = &i; 
 printf("*p = %d \n",*p); 
 getch(); 
} 
7 
4.1.1. Tổng quan về con trỏ 
c. Sử dụng biến con trỏ: 
Một biến con trỏ có thể được gán bởi: 
Địa chỉ của một biến khác: 
ten_bien_con_tro = &ten_bien; 
Giá trị của một con trỏ khác (tốt nhất là cùng kiểu): 
ten_bien_con_tro2 = ten_bien_con_tro1; 
Giá trị NULL (số 0): 
ten_bien_con_tro = 0; 
Gán giá trị cho biến con trỏ: 
*ten_bien_con_tro = 10; 
8 
4.1.1. Tổng quan về con trỏ 
Ví dụ 1: 
main() 
{ 
 int i = 3, j = 6; 
 int *p1, *p2; 
 p1 = &i; 
 p2 = &j; 
 *p1 = *p2; 
} 
9 
4.1.1. Tổng quan về con trỏ 
Ví dụ 2: 
main() 
{ 
 int i = 3, j = 6; 
 int *p1, *p2; 
 p1 = &i; 
 p2 = &j; 
 p1 = p2; 
} 
10 
4.1.1. Tổng quan về con trỏ 
d. Con trỏ void 
void *ten_bien_con_tro; 
Con trỏ đặc biệt, không có kiểu, 
Có thể nhận giá trị là địa chỉ của một biến thuộc bất kỳ kiểu dữ liệu nào. 
Ví dụ: 
void *p, *q; 
int x = 21; 
float y = 34.34; 
p = &x; q = &y; 
11 
4.1.2. Các phép toán làm việc với con trỏ 
Cộng / trừ con trỏ với một số nguyên ( int , long ) Kết quả là một con trỏ cùng kiểu 	 
ptr --; // ptr trỏ đến vị trí của phần tử đứng trước nó . 
Trừ hai con trỏ cho nhau 
Kết quả là một số nguyên 
Kết quả này nói lên khoảng cách ( số phần tử thuộc kiểu dữ liệu của con trỏ ) ở giữa hai con trỏ . 
Các phép toán : Cộng , nhân , chia, lấy số dư trên con trỏ là không hợp lệ . 
Ví dụ : (p2 trỏ đến số nguyên nằm ngay sau x trong bộ nhớ ) 
int x, *p1, *p2; 
p1= &x; 
p2= p1+1; 
12 
BÀI 4:	CON TRỎ VÀ MẢNG 
4 .1. Con trỏ và địa chỉ 
4.1.1. Tổng quan về con trỏ 
4.1.2. Các phép toán làm việc với con trỏ 
4.2. Mảng 
4.2.1. Khái niệm mảng 
4.2.2. Khai báo và sử dụng mảng 
4.2.3. Các thao tác cơ bản làm việc trên mảng 
4.3. Sử dụng con trỏ làm việc với mảng 
13 
4.2.1. Khái niệm mảng 
Mảng là một tập hợp hữu hạn các phần tử có cùng kiểu dữ liệu được lưu trữ liên tiếp nhau trong bộ nhớ . 
Các phần tử trong mảng có cùng tên (và cũng là tên mảng) nhưng phân biệt với nhau ở chỉ số cho biết vị trí của chúng trong mảng . 
c[6] 
-45 
6 
0 
72 
1543 
-89 
0 
62 
-3 
1 
6453 
78 
c[0] 
c[1] 
c[2] 
c[3] 
c[11] 
c[10] 
c[9] 
c[8] 
c[7] 
c[5] 
c[4] 
14 
4.2.2. Khai báo và sử dụng mảng 
a. Khai báo: 
Cú pháp: 
Kieu_du_lieu ten_mang[kich_thuoc_mang]; 
Ví dụ: 
char c[12]; 
Phần tử đầu tiên có chỉ số 0 
n phần tử của mảng có tên c : 
c[ 0 ], c[ 1 ]...c[ n – 1 ] 
int mang_nguyen[4]; 
float mang_thuc[6]; 
c[6] 
-45 
6 
0 
72 
1543 
-89 
0 
62 
-3 
1 
6453 
78 
c[0] 
c[1] 
c[2] 
c[3] 
c[11] 
c[10] 
c[9] 
c[8] 
c[7] 
c[5] 
c[4] 
15 
4.2.2. Khai báo và sử dụng mảng 
a. Khai báo ( tiếp ): 
Mảng nhiều chiều : 
Mỗi phần tử của mảng cũng là một mảng khác Giống vector trong toán học . 
Ví dụ : 
Mảng 2 chiều : int a[6][5]; 
Mảng 3 chiều : int b[3][4][5]; 
16 
4.2.2. Khai báo và sử dụng mảng 
b. Sử dụng mảng : 
Truy cập vào 1 phần tử của mảng thông qua tên mảng và chỉ số của phần tử đó . 
Cú pháp : ten_mang [ chi_so_cua_phan_tu ] 
Ví dụ 1: int mang_nguyen[3]; 
mang_nguyen[0] : Phần tử thứ 1. 
mang_nguyen[1] : Phần tử thứ 2. 
mang_nguyen[2] : Phần tử thứ 3. 
17 
4.2.2. Khai báo và sử dụng mảng (2) 
b. Sử dụng mảng ( tiếp ): 
Ví dụ 2: int a[6][5]; 
a[0] là phần tử đầu tiên của mảng , là 1 mảng 
 Phần tử đầu tiên của mảng a[0] là a[0][0], 
a [2][3] sẽ là phần tử thứ 4 của phần tử thứ 3 của a . 
 a[i][j] sẽ là phần tử thứ j+1 của a[i] , mà phần tử a[i] lại là phần tử thứ i+1 của a. 
18 
4.2.3. Các thao tác cơ bản làm việc trên mảng 
a. Nhập dữ liệu cho mảng: 
Nhập dữ liệu cho từng phần tử của mảng 
Ví dụ 1: 
float a[10]; int i; 
scanf( “ %f ” ,&a[1]); 
a[2] = a[1] + 5; 
Ví dụ 2: 
int b[10]; 
int i; 
//Nhap gia tri tu ban phim cho tat ca cac phan tu mang b 
for(i = 0; i < 10; i++) 
{ 
	printf( “ \n Nhap gia tri cho b[%d] ” , i); 
	scanf( “ %d ” ,&b[i]); 
} 
19 
4.2.3. Các thao tác cơ bản làm việc trên mảng (2) 
a. Nhập dữ liệu cho mảng (tiếp): 
Trường hợp không biết mảng sẽ có bao nhiêu phần tử mà chỉ biết số phần tử tối đa có thể có của mảng. Ví dụ: 
int a[100];//Khai bao mang, so phan tu toi da la 100 
int n; // Bien luu giu so phan tu thuc su cua mang 
int i; 
printf( “ \n Cho biet so phan tu cua mang: “ ); 
scanf( “ %d ” ,&n); 
for(i = 0; i < n; i++) 
{ 
	printf("\n a[%d] = ", i); 
	scanf("%d",&a[i]); 
} 
20 
4.2.3. Các thao tác cơ bản làm việc trên mảng (3) 
a. Nhập dữ liệu cho mảng (tiếp): 
Mảng có thể được khởi tạo giá trị ngay khi khai báo 
int a[4] = {4, 9, 22, 16}; 
float b[3] = {40.5, 20.1, 100}; 
char c[5] = { ‘ h ’ , ‘ e ’ , ‘ l ’ , ‘ l ’ , ‘ o ’ }; 
 Câu lệnh thứ nhất có tác dụng tương đương với 4 lệnh gán: 
a[0] = 4; a[1] = 9; a[2] = 22; a[3] = 16; 
21 
b. Xuất dữ liệu chứa trong mảng 
#include 
#include 
#define KT 6 
void main() 
{ 
	int a[KT]; 
	int i, k; 
	//Nhap gia tri cho cac phan tu mang a tu ban phim 
	for(i = 0; i < KT; i++) 
	{ 
	 printf(“\n a[%d] = “, i); 
	 scanf(“%d”, &a[i]); 
	} 
 printf("\nBat dau hien thi gia tri cac phan tu\n"); 
 printf(“\n a[3] = %d”, a[3]); 
22 
b. Xuất dữ liệu chứa trong mảng (2) 
//Hien thi gia tri tat ca cac phan tu 
//Moi phan tu tren 1 dong 
for(i = 0; i < KT; i++) 
	 printf(“\n%d”, a[i]); 
printf(“\n”); // Xuong dong moi 
/* Hien thi gia tri cua tat ca cac phan tu mang a 
 tren 1 dong, cac phan tu cach nhau 1 dau tab */ 
for(i = 0; i < KT; i++) 
	 printf(“%d\t“, a[i]); 
23 
b. Xuất dữ liệu chứa trong mảng (3) 
// Hien thi k phan tu tren mot dong 
printf(“\n Cho biet gia tri cua k = “); 
scanf(“%d”,&k); 
for(i = 0; i < KT; i++) 
{ 
	printf(“%d “, a[i]); 
	if((i+1)%k == 0) //da hien thi k ptu 
 printf(“\n”); //xuong dong 
} 
getch(); 
} 
24 
Kết quả: 
25 
c. Tính tổng giá trị các phần tử 
 #include 
 #define SIZE 12 
 void main() 
 { 
	int a[SIZE] = {1, 3, 5, 4, 7, 2, 99, 16, 	 45, 67, 89, 45}; 
 int i; 
 int total = 0; 
 for ( i = 0; i < SIZE; i++ ) { 
 total += a[ i ]; 
 } /* end for */ 
 printf( "Tong gia tri cac phan tu trong mang la: 	%d\n", total ); 
	getch(); 
} 
26 
? 
Nhập vào điểm của 8 sinh viên rồi tính điểm trung bình của 8 sinh viên đó. Chú ý điểm có giá trị từ 0 đến 10. 
27 
#include 
#define DIEM_MAX 10 
#define SO_SV 8 
int ds_diem[SO_SV]; int i, tong = 0; 
void main() 
{ 
 for( i=0; i< SO_SV; i++) 
 { 
 do 
 { 
	 printf( "Nhap vao diem sinh vien thu %d: ", i+1); 
	 scanf( "%d", &ds_diem[i] ); 
 	 if (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0) 
 	 printf("\nDiem phai tu 0 den %d\n", DIEM_MAX); 
 } 
 while (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0); 
 tong += ds_diem[i]; 
 } 
 printf( "\n\n Diem TB la %d\n", (tong/SO_SV)); 
 getch(); 
} 
28 
#include 
#define DIEM_MAX 10 
#define SO_SV 8 
void main() 
{ 
	 int ds_diem[SO_SV]; int i, tong = 0; 
 for( i=0; i< SO_SV; i++) 
 { 
 do 
 { 
	 printf( "Nhap vao diem sinh vien thu %d: ", i+1); 
	 scanf( "%d", &ds_diem[i] ); 
 	 if (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0) 
 	 printf("\nDiem phai tu 0 den %d\n", DIEM_MAX); 
 } 
 while (ds_diem[i] > DIEM_MAX || ds_diem[i] < 0); 
 tong += ds_diem[i]; 
 } 
 printf( "\n\n Diem TB la %.2f\n", (float)(tong/SO_SV)); 
 getch(); 
} 
29 
4.2.3. Các thao tác cơ bản làm việc trên mảng (4) 
Tìm phần tử lớn nhất, nhỏ nhất 
Tìm kiếm trên mảng 
Sắp xếp mảng 
30 
a. Tìm các phần tử có giá trị lớn nhất, nhỏ nhất 
#define KT 100 
int a[KT]; 
max = a[0]; 
Dùng vòng lặp for so sánh max với phần tử có chỉ số từ 1, 2, , n-1 của mảng a. 
Nếu max < phần tử i thì gán max = phần tử i 
Ngược lại duyệt phần tử tiếp theo 
31 
#include 
#define KT 100 
void main(){ 
	int a[KT]; int i, n; int max; 
	printf("\n Cho biet so phan tu cua mang: "); 
 scanf("%d",&n); 
	for(i = 0; i < n; i++) 
	{ 
	printf("\n a[%d] = ",i); scanf("%d",&a[i]); 
	} 
	max = a[0]; 
	for(i = 1; i < n; i++) 
	if(max < a[i]) max = a[i]; 
	printf("\nPhan tu lon nhat trong mang la: %d",max); 
	getch(); 
} 
a. Tìm các phần tử có giá trị lớn nhất, nhỏ nhất (2) 
32 
b. Tìm kiếm trên mảng 
Bài 1: 
Nhập vào các phần tử của mảng thực có số lượng các phần tử tối đa là 100. 
Nhập 1 số thực giá trị bất kỳ và tìm trên mảng đó có bao nhiêu phần tử có giá trị bằng số thực vừa nhập? Nếu có, hãy đưa ra chỉ số của các phần tử đó. 
33 
b. Tìm kiếm trên mảng (2) 
Cách làm: 
Đếm các phần tử trong mảng thoả mãn điều kiện nào đó 
Sử dụng biến đếm để lưu giá trị đếm được 
Duyệt mảng 
Kiểm tra điều kiện cần thiết, trong trường hợp điều kiện này thoả mãn, tăng biến đếm lên 1 đơn vị 
34 
#include 
#include 
#define KT 100 
void main() 
{ 
	float m[KT], kiem_tra; int chi_so[KT]; int i, dem; 
 int n; // so phan tu thuc su trong mang 
 do{ 
 printf(“ Cho biet so phan tu co trong mang: “); 
 scanf(“%d”,&n); 
 if (nKT) printf(“Nhap sai, nhap lai\n”); 
 } while (n KT); 
	 for(i = 0;i < n; i++) 
	{ 
	 printf(“\n Cho biet gia tri cua m[%d] = “,i); 
	 scanf(“%f”, &m[i]]; 
	} 
	printf(“\n Nhap vao gia tri thuc can kiem tra: “); 
	scanf(“%f”,&kiem_tra); 
35 
 dem = 0; //Bat dau tim kiem 
 for(i = 0;i < n;i++) 
	 if(m[i] == kiem_tra) 
 { 
	 chi_so[dem] = i; 
	dem ++; 
 } 
 if (dem > 0) 
 { 
 	 printf(“\n Trong mang co %d phan tu = %.2f”, 
	 dem, kiem_tra); 
	 printf(“\n Chi so cua cac phan tu la: “); 
	 for(i = 0; i < dem; i++) 
	 printf(“%3d”, chi_so[i]); 
 } 
 else 
 printf(“\n Khong co phan tu nao = %.2f”, kiem_tra); 
 getch(); 
} 
36 
b. Tìm kiếm trên mảng (3) 
Bài 2 
Nhập vào các phần tử của mảng nguyên có số lượng các phần tử tối đa là 100. 
Nhập 1 số nguyên giá trị bất kỳ và đưa ra các phần tử cùng các chỉ số trong mảng có giá trị nhỏ hơn số nguyên vừa nhập. 
37 
#include 
#define KT 100 
void main() 
{ 
 int n, a[KT], i, x; 
 printf("\nNhap vao so luong phan tu cua mang: "); 
 scanf("%d", &n); 
 printf("Nhap vao cac phan tu cua mang : "); 
 for (i=0; i<n; i++) 
 scanf("%d", &a[i]); 
 printf("\nNhap vao gia tri x: "); 
 scanf("%d", &x); 
 printf("\nCac phan tu nho hon %d gom co: ", x); 
 printf("\nChi so Gia tri"); 
 for (i=0; i<n; i++) 
 if (a[i] < x) 
 printf("\n%4d %6d", i, a[i]); 
 getch(); 
} 
38 
c. Sắp xếp mảng 
Đây là một bài toán cơ bản trong lập trình 
Dữ liệu ( trong trường hợp này là các phần tử trong mảng ) được sắp xếp theo một thứ tự tăng / giảm dần 
Giải thuật thông dụng nhất : Giải thuật sắp xếp nổi bọt (Bubble sort) 
Duyệt mảng một số 
So sánh các cặp phần tử cạnh nhau 
Nếu thứ tự các phần tử này đã đúng , không cần thay đổi 
Nếu thứ tự các phần tử này không đúng , cần đổi chỗ các phần tử trong mảng 
39 
c. Sắp xếp mảng (2) 
Ví dụ: 
Mảng ban đầu: 8 4 6 2 7 3 
Các phần tử nhỏ nhất "nổi" dần lên đầu mảng 
8 
4 
6 
2 
7 
3 
2 
8 
4 
6 
3 
7 
2 
3 
8 
4 
6 
7 
2 
3 
4 
8 
6 
7 
2 
3 
4 
6 
8 
7 
2 
3 
4 
6 
7 
8 
40 
Sắp xếp nổi bọt 
#include 
#define KT 10 
int main() 
{ 
	int a[KT] = {2,6,4,8,10,12,89,68,45,37}; 
 int i, j; 
 int temp; //Bien tam, doi cho giua cac phan tu 
 printf( "Cac phan tu theo trat tu ban dau\n"); 
 /* Hien thi mang ban dau */ 
 for (i = 0; i < KT; i++ ) { 
 printf( "%4d", a[i] ); 
 } 
41 
 for (i=0; i<KT-1; i++) 
 	for (j=0; j<KT-1-i; j++) 
	 if (a[j+1] > a[j]) //so sanh 2 so canh nhau 
 { 
	 temp = a[j]; 
	 a[j] = a[j+1]; a[j+1] = temp; 
	 } 
	 /* Hien thi mang da sap xep */ 
	 printf( "\nMang theo thu tu tang \n"); 
for (i=0; i<KT; i++) { 
 printf( "%4d", a[i] ); 
 } 
 printf( "\n" ); 
 getch(); 
} 
42 
Sắp xếp lựa chọn (Selection Sort): 
Ở bước thứ i, i=1..n-1 
Thực hiện so sánh a[i] với a[j], j=i+1..n 
Nếu a[i] < a[j] thì đổi chỗ 2 phần tử này 
Khi duyệt đến cuối dãy, đưa được phần tử nhỏ thứ i về vị trí thứ i 
	for (i=0; i<KT-1; i++ ) 
	 for (j=i+1; j<KT; j++ ) 
	 if (a[i] < a[j]) 
	 { 
	 temp = a[i]; 
	 a[i] = a[j]; a[j] = temp; 
 } 
43 
Cải tiến 
Không đổi chỗ quá nhiều 
Khai báo 1 biến để lưu chỉ số phần tử nhỏ nhất 
Cuối 1 vòng lặp mới tiến hành đổi chỗ phần tử nhỏ nhất lên đầu dãy 
Kiểm tra nếu dãy đã sắp xếp rồi thì dừng luôn 
44 
d. Tìm kiếm nhị phân 
Trên mảng đã sắp xếp tăng dần hoặc giảm dần 
Nếu giá trị cần tìm > giá trị của phần tử đầu tiên và nhỏ hơn giá trị của phần tử trong mảng: 
So sánh phần tử giữa mảng với giá trị cần tìm 
Nếu bằng, tìm thấy và kết thúc 
Nếu giá trị cần tìm < giá trị giữa , tìm trong nửa trước của mảng 
Nếu giá trị cần tìm > giá trị giữa , tìm trong nửa sau của mảng 
Lặp lại cho tới khi tìm thấy hoặc đã duyệt qua hết các nửa 
Mỗi lần như vậy ta loại bỏ được một nửa số phần tử đang xét - tìm kiếm nhị phân 
 Giải thuật này sẽ thực hiện tìm kiếm rất nhanh 
45 
#include 
#define KT 20 
void main() 
{ 
	int ds[KT] = {1, 4, 8, 9, 18, 27, 38, 49, 55, 59, 67,68, 69, 72, 75, 79, 87, 88, 97, 98}; 
 int cs_min, cs_max; /* Bien luu chi so cua ptu dau 	va ptu cuoi trong mang */ 
 int gtri_tim; // gia tri can tim kiem 
 int cs; // chi so 
 scanf( “ Nhap gia tri can tim: %d ” , & gtri_tim); 
 minindex = 0; // Chi so cua phan tu dau tien 
 maxindex = KT-1; // Chi so cua phan tu cuoi cung 
46 
 while (cs_min < cs_max) 
 { 
	 cs = (cs_max + cs_min)/2; 
 if (ds[cs]==gtri_tim) //Neu tim thay thi dung 
 { 
	cs_min = cs_max; break; 
 } 
 if (gtri_tim > ds[cs]) // Khoang sau 
 { 
	cs_min = cs + 1; 
	 } 
 else{ 
	cs_max = cs - 1; 
	 } //Khoang truoc 
 } 
 if (cs_min == cs_max){ 
	 printf( “ Chi so cua phan tu can tim la:%d ” , cs); 
 } 
} 
47 
BÀI 4:	CON TRỎ VÀ MẢNG 
4 .1. Con trỏ và địa chỉ 
4.1.1. Tổng quan về con trỏ 
4.1.2. Các phép toán làm việc với con trỏ 
4.2. Mảng 
4.2.1. Khái niệm mảng 
4.2.2. Khai báo và sử dụng mảng 
4.2.3. Các thao tác cơ bản làm việc trên mảng 
4.3. Sử dụng con trỏ làm việc với mảng 
48 
4.3.1. Con trỏ và mảng 1 chiều 
Mảng a 
a là một địa chỉ và a có giá trị bằng &a[0] 
Có thể gán con trỏ p bằng địa chỉ của mảng 
 Có thể dùng con trỏ này để duyệt các phần tử trong mảng. 
Ví dụ: 
int a[10], *p; p = a; 
p+1 sẽ trỏ tới phần tử cùng kiểu ngay sau phần tử đầu tiên của mảng, chính là a[1] , nghĩa là *(p+1) chính là a[1] . 
p+2 sẽ trỏ tới a[2] , hay *(p+2) là a[2] 
. 
p+i sẽ trỏ tới a[i] 
49 
4.3.1. Con trỏ và mảng 1 chiều (tiếp) 
#define N 5 
int tab[5] = {1, 2, 6, 0, 7}; 
void main() 
{ 
int i; int *p; 
p = tab; 
for (i = 0; i < N; i++) 
{ 
printf(" %d \n",*p); 
p++; 
} 
getch(); 
} 
50 
Câu hỏi? 

File đính kèm:

  • pptbai_giang_tin_hoc_dai_cuong_phan_2_lap_trinh_bang_ngon_ngu_c.ppt