Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền

 Mảng là tập hợp các giá trị cùng kiểu dữ liệu

 Khai báo:

<[Kích thước chiều thứ nhất][Kích thước chiều thứ 2][ ]>;

 Mỗi phần tử của mảng lưu trữ 1 giá trị.

 Mỗi một phần tử của mảng được coi như 1 biến.

 Có bao nhiêu kiểu biến thì có bấy nhiêu kiểu mảng.

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 1

Trang 1

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 2

Trang 2

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 3

Trang 3

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 4

Trang 4

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 5

Trang 5

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 6

Trang 6

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 7

Trang 7

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 8

Trang 8

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 9

Trang 9

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 31 trang Danh Thịnh 09/01/2024 2980
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền", để 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 Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền

Bài giảng Kỹ thuật lập trình - Chương 3: Mảng và con trỏ - Nguyễn Thị Hiền
Ngôn ngữ lập trình C
Chương 3 – Mảng và con trỏ
3.1. Mảng
3.2. Con trỏ
3.3. Liên hệ giữa mảng và con trỏ
3.4. Cấp phát bộ nhớ động
3.5. Xâu ký tự
3.1. Mảng
 Mảng là tập hợp các giá trị cùng kiểu dữ liệu
 Khai báo:
 <[Kích thước chiều thứ
nhất][Kích thước chiều thứ 2][]>;
 Mỗi phần tử của mảng lưu trữ 1 giá trị.
 Mỗi một phần tử của mảng được coi như 1 biến.
 Có bao nhiêu kiểu biến thì có bấy nhiêu kiểu mảng.
3.1. Mảng
 Số chiều và kích thước của mảng
Ví dụ các khai báo: int a[10],b[4][2];
float x[5],y[3][3];
Khi đó ta có:
Thứ tự Tên mảng Kiểu mảng Số chiều Kích thước Các phần tử
1 a int 1 10 a[0],a[1],a[2]...a[9]
2 b int 2 4x2
b[0][0], b[0][1]
b[1][0], b[1][1]
b[2][0], b[2][1]
b[3][0], b[3][1]
3 x float 1 5 x[0],x[1],x[2]...x[4]
4 y float 2 3x3
y[0][0], y[0][1], y[0][2]
y[1][0], y[1][1], y[1][2]
y[2][0], y[2][1], y[1][2]
3.1. Mảng
 Một số lưu ý
 Các phần tử của mảng được cấp phát trong các khoảng nhớ liên
tiếp trong bộ nhớ.
 Một phần tử cụ thể của mảng được xác định thông qua tên mảng và
chỉ số của nó.
 Chỉ số của mảng phải có kiểu nguyên, không vượt quá kích
thước mảng.
 Chỉ số của mảng bắt đầu từ 0.
 Khi chỉ số vượt ra ngoài kích thước mảng, trình biên dịch vẫn biên
dịch thành công, tuy nhiên khi thực hiện chương trình sẽ có lỗi.
 Kích thước của mảng phải là một hằng số.
3.1. Mảng
 Khởi tạo giá trị ban đầu cho biến mảng
 Để khởi tạo giá trị ban đầu cho biến mảng, ta có thể sử
dụng biểu thức hằng hoặc các câu lệnh gán. Ví dụ:
float x[6] = {3.2,0,5.1,23,0,42};
float y[6] = {3.2};
int z[3][2] = {{25,31},{12,13},{45,15}};
 Khi khởi tạo giá trị ban đầu cho biến mảng, có thể không
cần chỉ ra kích thước mảng. Ví dụ:
float a[]={0,5.1,23,0,42};
int m[][3]={{25,31,4},{12,13,89},{45,15,22}};
3.1. Mảng
 Một số thao tác cơ bản đối với mảng
 Duyệt mảng (nhập, xuất, tính tổng, .)
 Tìm kiếm
 Tìm xem một phần tử nào đó có thuộc mảng hay không?
 Tìm các phần tử thỏa mãn tính chất nào đó.
 
 Sắp xếp (Mảng một chiều)
 Sắp xếp giá trị các phần tử của mảng theo thứ tự tăng dần hoặc
giảm dần
3.1. Mảng
 Sơ đồ khối sau thể
hiện thuật toán tìm
kiếm nhị phân. Hãy
viết chương trình
nhập N số thực (N 
nhập từ bàn phím) 
vào mảng array, 
nhập khóa key, tìm
kiếm xem key có
xuất hiện trong dãy
không, nếu xuất
hiện thì tại vị trí
nào?
Begin
Low = 0; High = N-1; 
Flag = 0; Pos = 0
Low <= High;
Flag = 0
Mid = (Low + High)/2;
Key = A[Mid]
Flag = 1;
Pos = MId
Key < A[Mid] High = Mid - 1;
Low = Mid +1;
Flag = 0
Print “Khong tim thay”
Print Key xuat hien tai vi tri Pos
End
Y
Y
Y
N
N
Y
N
N
3.2. Con trỏ
 Khái niệm: Là một đối tượng dữ liệu mà giá trị của
nó là địa chỉ của một đối tượng khác
 Đặc trưng
 Không lưu trữ giá trị của biến đó
 Như vậy, nếu một biến chứa địa chỉ của một biến
khác, thì biến này được gọi là con trỏ, trỏ đến biến
thứ hai.
 Kích thước của biến con trỏ không phụ thuộc vào 
kiểu dữ liệu, luôn có kích thước cố định là 2 bytes
hoặc 4 bytes
3.2. Con trỏ
 Cú pháp khai báo
* ;
 Ý nghĩa: Khai báo 1 biến có tên là Tên_con_trỏ dùng để
chứa địa chỉ của 1 biến có kiểu là Kiểu_dữ_liệu.
 Ví dụ:
int a, b, *pa, *pb;
float f, *pf;
 Chú ý: Nếu chưa muốn khai báo kiểu dữ liệu mà con trỏ
ptr đang trỏ đến, ta sử dụng : void *ptr;
3.2. Con trỏ
 Toán tử &
 Dùng để định vị con trỏ đến địa chỉ của 1 biến đang làm việc
 Cú pháp: = &;
 Giải thích: gán địa chỉ của biến Tên_biến cho con trỏ Tên_con_trỏ
pt=&i; 
 Khi gán địa chỉ của biến cho con trỏ cần phải lưu ý kiểu dữ liệu của 
chúng.
int Bien_Nguyen; 
float *Con_Tro_Thuc; 
... 
Con_Tro_Thuc=&Bien_Nguyen;
3.2. Con trỏ
 Toán tử *
 Để truy cập nội dung của ô nhớ con trỏ chỉ tới
 Cú pháp: *
 Với cách cách truy cập này thì * có 
thể coi là một biến có kiểu được mô tả trong phần 
khai báo biến con trỏ.
 Ví dụ
int x=100; 
int *ptr; 
ptr=&x; 
int y= *ptr;
3.2. Con trỏ
 Các phép toán trên con trỏ
 Phép gán: chỉ thực hiện với các con trỏ cùng kiểu. 
Muốn gán các con trỏ khác kiểu phải dùng phép ép
kiểu.
int x;
char *pc;
pc=(char*)(&x);
 Phép tăng, giảm địa chỉ: di chuyển giữa các ô nhớ
float x[30],*px;
px=&x[10];
 px + i trỏ tới phần tử x[10+i]
 px - i trỏ tới phần tử x[10-i]
3.2. Con trỏ
 Các phép toán trên con trỏ
 Phép truy cập bộ nhớ: Con trỏ float trỏ tới địa chỉ dài 4 
byte, con trỏ int trỏ tới địa chỉ dài 2 byte, con trỏ char
trỏ tới địa chỉ dài 1 byte.
float *pf; int *pi; char *pc;
 Phép so sánh: so sánh các con trỏ cùng kiểu
 p1<p2: địa chỉ p1 trỏ tới thấp hơn địa chỉ p2 trỏ tới.
 p1==p2: địa chỉ p1 trỏ tới cũng là địa chỉ p2 trỏ tới.
 p1>p2: địa chỉ p1 trỏ tới cao hơn địa chỉ p2 trỏ tới
3.2. Con trỏ
 Con trỏ NULL
 Con trỏ không chứa địa chỉ của bất kỳ vùng nhớ nào.
 Nên khởi tạo giá trị NULL hoặc địa chỉ của vùng nhớ nào đó cho 
biến trỏ lúc khai báo.
 Con trỏ void
 Cú pháp: void *tên_con_trỏ;
 Đây là con trỏ đặc biệt, con trỏ không kiểu, nó có thể nhận địa 
chỉ kiểu bất kỳ
 Ví dụ: void *pa; float a[20][30]; pa=a;
 Thường được dùng làm tham số hình thức, nhận bất kỳ địa chỉ 
kiểu nào từ tham số thực. 
 Chú ý: Các phép toán tăng giảm địa chỉ, so sánh và truy cập 
bộ nhớ không dùng được trên con trỏ void.
3.2. Con trỏ
 Mảng con trỏ
 Kiểu phần tử của biến mảng có thể là kiểu con trỏ. 
Các biến mà địa chỉ chứa trong các phần tử mảng
con trỏ là một mảng, nhưng có vùng nhớ không liên 
tục.
 Thường dùng để lưu mảng của chuỗi.
 Ví dụ: 
char *s[5] = {“Orange”, “Mango”, “Coconut”, 
“Longan”, “Banana”};
Mỗi phần tử của s trỏ đến char * (1 chuỗi)
Mảng không chứa chuỗi, chỉ trỏ đến chuỗi.
3.2. Con trỏ
 Con trỏ đa cấp
 Bản thân biến trỏ cũng có địa chỉ, do đó, có thể chứa địa 
chỉ của nó trong 1 biến trỏ khác, gọi là con trỏ trỏ đến 
con trỏ, hay con trỏ 2 cấp.
 Số lượng dấu “*” xác định cấp của 1 biến trỏ.
 Con trỏ 2 cấp có liên quan mật thiết với mảng 2 chiều.
 Ví dụ:
int a[2][3]; 
int **p = (int **

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_3_mang_va_con_tro_nguyen.pdf