Biên soạn: TS Ngô Hữu Phúc
Biên soạn: TS Ngô Hữu Phúc
Bộ môn Khoa học máy tính
Bộ môn Khoa học máy tính
Học viện Kỹ thuật quân sự
Học viện Kỹ thuật quân sự
Lập trình cơ bản với C
Chương 7: Con trỏ và mảng
1
Chương 7 - copyright NHP
Khái niệm:
Khái niệm:
Con trỏ: là một biến chứa địa chỉ vùng nhớ của
biến khác.
Con trỏ 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 byte.
2
Chương 7 - copyright NHP
7.1. Khai báo biến con trỏ.
7.1. Khai báo biến con trỏ.
Chương 7 - copyright NHP
3
Giải thích: Ta gán địa chỉ của biến Tên biến cho con trỏ Tên biến con
trỏ.
Ví dụ: Gán địa chỉ của biến a cho con trỏ pa, gán địa chỉ của biến b cho
con trỏ pb.
pa=&a; pb=&b;
Lúc này, hình ảnh của các biến trong bộ nhớ được mô tả
7.2.
7.2.
Các thao tác trên con trỏ
Các thao tác trên con trỏ
(t)
(t)
Chương 7 - copyright NHP
5
Lưu ý:
Khi gán địa chỉ của biến tĩnh cho con trỏ cần phải lưu ý
kiểu dữ liệu của chúng.
Ví dụ sau đây không đúng do không tương thích kiểu:
int Bien_Nguyen;
float *Con_Tro_Thuc;
...
Con_Tro_Thuc=&Bien_Nguyen;
Phép gán ở đây là sai vì Con_Tro_Thuc là một con trỏ
kiểu float (nó chỉ có thể chứa được địa chỉ của biến kiểu
float); trong khi đó, Bien_Nguyen có kiểu int
7
#include “stdio.h”
#include “conio.h”
void main()
{
int a,b,*pa,*pb;
a=2;
b=8;
printf("\nGia tri cua bien a=%d \nGia tri cua bien b=%d
",a,b);
pa=&a;
pb=&b;
printf("\nNoi dung cua o nho con tro pa tro toi=%d",*pa);
printf("\nNoi dung cua o nho con tro pb tro toi=%d
",*pb);
*pa=20; /* thay doi gia tri cua *pa*/
*pb=25; /* thay doi gia tri cua *pb*/
printf("\nGia tri moi cua bien a=%d \nGia tri moi cua
bien b=%d “ ,a,b);
/* a, b thay doi theo*/
getch();
}
7.3. Con trỏ và mảng một chiều
7.3. Con trỏ và mảng một chiều
Chương 7 - copyright NHP
8
Trong C có mối quan hệ chặt chẽ giữa con trỏ và mảng: các phần tử của mảng có thể
được xác định nhờ chỉ số hoặc thông qua con trỏ.
7.2.1. Phép toán lấy địa chỉ:
Khi đó, 4 cách viết sau có tác dụng như nhau và cùng truy cập đến
phần tử thứ i của mảng a:
a[i] *(a+i) pa[i] *(pa+i)
Ví dụ:
Ví dụ: Vào số
liệu cho các
phần tử của
một mảng và
tính tổng các
phần tử của
chúng.
Chương 7 - copyright NHP
10
Cách 1:
#include "stdio.h"
void main()
{
float a[4],tong;
int i;
for (i=0;i<4;++i)
{
printf("\n a[%d]=",i);
scanf("%f",(a+i));
}
tong=0;
for (i=0;i<4;++i)
tong+=a[i];
printf("\n Tong cac phan tu mang la:%8.2f ",tong);
}
phần tử của
một mảng và
tính tổng các
phần tử của
chúng.
Chương 7 - copyright NHP
12
Cách 3:
#include "stdio.h"
void main()
{
float a[4],tong,*troa;
int i;
troa=a;
for (i=0;i<4;++i)
{
printf("\n a[%d]=",i);
scanf("%f",troa+i);
}
tong=0;
for (i=0;i<4;++i)
tong+=*(troa+i);
printf("\n Tong cac phan tu mang la:%8.2f ",tong);
}