1
TIN HỌC ĐẠI CƯƠNG
www.uit.edu.vn
BÀI 9
BÀI 9
CON TRỎ VÀ ĐỊA CHỈ
CON TRỎ VÀ ĐỊA CHỈ
MẢNG
MẢNG
HÀM VÀ CHƯƠNG TRÌNH
HÀM VÀ CHƯƠNG TRÌNH
CHUỖI KÝ TỰ
CHUỖI KÝ TỰ
Tin học đại cương
2
NỘI DUNG
NỘI DUNG
CON TRỎ VÀ ĐỊA CHỈ
5
Tin học đại cương
3
Toán tử địa chỉ &
Con trỏ
Qui tắc sử dụng con trỏ
Qui tắc về kiểu giá trị trong khai báo
NỘI DUNG BÀI CON TRỎ VÀ ĐỊA CHỈ
NỘI DUNG BÀI CON TRỎ VÀ ĐỊA CHỈ
Tin học đại cương
4
TOÁN TỬ ĐỊA CHỈ
TOÁN TỬ ĐỊA CHỈ
CÁC KHÁI NIỆM LIÊN QUAN ĐẾN BIẾN
Ví dụ: int a = 15;
Giá trị của biến
Kiểu biến
Tên biến
Tin học đại cương
5
ĐỊA CHỈ CỦA BIẾN
Khái niệm: Địa chỉ của biến là số thứ
tự của byte đầu tiên trong một dãy các
byte liên tiếp mà máy dành cho biến.
Phân loại địa chỉ biến: địa chỉ kiểu
int, float, double, …
Lấy địa chỉ của một biến: &
TOÁN TỬ ĐỊA CHỈ
TOÁN TỬ ĐỊA CHỈ
Tin học đại cương
6
Ví dụ:
int x =5;
x được cấp phát vùng nhớ có kích thước
2 byte liên tiếp. Giả sử tại địa chỉ 1050,
ta có:
Địa chỉ của x: &x = 1050, giá trị của x = 5
1050
5x
TOÁN TỬ ĐỊA CHỈ
TOÁN TỬ ĐỊA CHỈ
Tin học đại cương
7
KHÁI NIỆM BIẾN CON TRỎ
Là một biến dùng để lưu địa chỉ của một
biến, mỗi loại địa chỉ sẽ có một kiểu con
trỏ tương ứng (phụ thuộc vào loại dữ liệu
lưu trữ trong địa chỉ đó)
PHÂN LOẠI CON TRỎ
Con trỏ kiểu int dùng để chứa địa chỉ của
các biến kiểu int. Tương tự ta có con trỏ
kiểu float, double, …
CON TRỎ
CON TRỎ
Tin học đại cương
8
KHAI BÁO BIẾN CON TRỎ
Con trỏ không kiểu:
Cú pháp khai báo:
void *tênbiến;
Ví dụ:
void *p, *q;
CON TRỎ
CON TRỎ
Tin học đại cương
9
Con trỏ có kiểu:
Chỉ chứa những địa chỉ của loại dữ
liệu phù hợp với kiểu dữ liệu mà ta đã
khai báo cho con trỏ.
Cú pháp khai báo:
<kiểu dữ liệu> *tênbiến;
Ví dụ:
int x = 5;
int *p, *q;
p = &x; // gán đ/c biến x cho p
CON TRỎ
CON TRỎ
Tin học đại cương
10
TÊN CON TRỎ
Sử dụng địa chỉ chứa trong con trỏ
Ví dụ:
int *p, *q;
int x = 5;
// gán đ/c biến x cho con trỏ p
p = &x;
// lưu đ/c trong p vào con trỏ q
q = p;
Giả sử địa chỉ của x là 1010 thì p = 1010
và q = 1010
QUI TẮC SỬ DỤNG CON TRỎ
QUI TẮC SỬ DỤNG CON TRỎ
Tin học đại cương
11
DẠNG KHAI BÁO CỦA CON TRỎ
Sử dụng giá trị lưu tại vùng nhớ mà
con trỏ trỏ tới
Ví dụ:
int *p, *q;
int x = 5, z;
p = &x; // *p = x = 5;
q = p; // *q = *p = x = 5
// z = 5 + 3*5 = 20;
z = *p + 3*(*q);
QUI TẮC SỬ DỤNG CON TRỎ
QUI TẮC SỬ DỤNG CON TRỎ
Tin học đại cương
12
Khi đó ba biểu thức sau đây là tương
đương:
*q = z+x;
*p = z+x;
x = z+x;
QUI TẮC SỬ DỤNG CON TRỎ
QUI TẮC SỬ DỤNG CON TRỎ
Tin học đại cương
13
NỘI DUNG
NỘI DUNG
MẢNG6
Tin học đại cương
14
NỘI DUNG BÀI MẢNG
NỘI DUNG BÀI MẢNG
Khái niệm
Khai báo
Chỉ số của mảng
Lấy địa chỉ các phần tử mảng
Nhập xuất mảng
Mảng và con trỏ
Mảng và hàm
Tin học đại cương
15
KHAI BÁO MẢNG
KHAI BÁO MẢNG
Cú pháp:
<KiểuDL> <Tên > [<Danh
sách các chiều >];
Ví dụ 1:
int a[100];
int P[100][100];
Ví dụ 2:
#define MAX 100
float c[MAX][MAX], d[MAX];
Tin học đại cương
16
CHỈ SỐ MẢNG
CHỈ SỐ MẢNG
KIỂU DỮ LIỆU CỦA CHỈ SỐ
Chỉ số của mảng phải là một giá trị kiểu đơn
giản, rời rạc: số nguyên, ký tự.
Nếu là số nguyên thì mặc định từ số 0.
Ví dụ: int A[5];
Tên mảng: A
Kiểu dữ liệu của từng phần tử trong mảng:
int
Số phần tử tối đa trong mảng: 5 phần tử
Các chỉ số được đánh số: 0 1 2 3 4
Tin học đại cương
17
LẤY ĐỊA CHỈ MỘT PHẦN TỬ
LẤY ĐỊA CHỈ MỘT PHẦN TỬ
Cú pháp:
&<Tên biến>[<chỉ số>];
Ví dụ:
int A[5];
scanf(“%d”, &A[0]);
Chú ý: Tên mảng chứa địa chỉ phần tử
đầu tiên của mảng.
Tin học đại cương
18
NHẬP XUẤT MẢNG (TRỰC TIẾP)
NHẬP XUẤT MẢNG (TRỰC TIẾP)
#include <stdio.h>
#include <conio.h>
#define MAX 100
void main()
{
int A[MAX], N, i;
printf(“So phan tu cua mang:");
scanf("%d", &N);
for(i=0;i<N;i++)
{
printf("Nhap phan tu A[%d]: ",i);
scanf("%d", &A[i]);
}
for(i=0; i<N; i++)
printf("%4d", A[i]);
}
Tin học đại cương
19
#include <stdio.h>
#include <conio.h>
#define MAX 100
void main()
{
float A[MAX], temp;
int N, i;
printf(“So phan tu cua mang: ");
scanf("%d", &N);
for(i=0; i<N; i++)
{
printf("Nhap phan tu A[%d]: ",i);
scanf("%f", &temp);
A[i]=temp;
}
for(i=0; i<N; i++)
printf("%3.1f", A[i]);
}
NHẬP XUẤT MẢNG (GIÁN TIẾP)
NHẬP XUẤT MẢNG (GIÁN TIẾP)
Tin học đại cương
20
SỰ TƯƠNG QUAN MẢNG VÀ CON TRỎ
SỰ TƯƠNG QUAN MẢNG VÀ CON TRỎ
Khi khai báo một mảng thì tên của mảng
là một hằng địa chỉ, chứa địa chỉ của phần
tử đầu tiên (phần tử có chỉ số 0).
Như vậy ta có thể nói mảng là con trỏ
hằng.
Xét khai báo: int a[5]; *pa=a; khi
đó con trỏ pa cũng giữ địa chỉ của phần
tử đầu tiên của mảng a và pa+i (hoặc
pa[i]) là địa chỉ của phần tử a[i].
Tin học đại cương
21
NHẬP XUẤT MẢNG BẰNG CON TRỎ
NHẬP XUẤT MẢNG BẰNG CON TRỎ
#include <stdio.h>
#include <conio.h>
#define MAX 100
void main()
{
int a[MAX], N, i, *pa;
pa = a;
printf(“So phan tu cua mang: ");
scanf("%d", &N);
for(i=0; i<N; i++)
{
printf("Nhap phan tu a[%d]: ", i);
scanf("%d", pa+i);
}
for(i=0; i<N; i++)
printf("%4d", *(pa+i));
}
Tin học đại cương
22
CÁC KHAI BÁO TƯƠNG ĐƯƠNG
int *pa; int pa[];
double *pa; double pa[];
char *pa; char pa[];
long *pa; long pa[];
SỰ TƯƠNG QUAN MẢNG VÀ CON TRỎ
SỰ TƯƠNG QUAN MẢNG VÀ CON TRỎ
Tin học đại cương
23
MẢNG VÀ HÀM
MẢNG VÀ HÀM
Khai báo hàm nhập mảng
void nhap(int a[MAX], int &N);
Phân tích
Tên hàm: nhap.
Tham số N là tham chiếu.
Tham số a là tham trị vì a là con trỏ hằng.
Giá trị trả về: không có.
Tin học đại cương
24
CHƯƠNG TRÌNH MINH HỌA
CHƯƠNG TRÌNH MINH HỌA
#include <stdio.h>
#include <conio.h>
void main()
{
int X[MAX],p;
nhap(X,p);
xuat(X,p);
sapxep(X,p);
xuat(X,p);
}
Tin học đại cương
25
// định nghĩa hàm nhập
void nhap(int A[], int N)
{
for(int i=0; i<N; i++)
{
printf(“Nhap phan tu thu %d: ", i);
scanf(“%d”, &A[i]);
}
}
// định nghĩa hàm xuất
void xuat(int A[], int N)
{
for(int i=0; i<N; i++)
{
printf("%4d", A[i]);
}
}
CHƯƠNG TRÌNH MINH HỌA (tt)
CHƯƠNG TRÌNH MINH HỌA (tt)