CON TRỎ
(POINTER)
Chương 7:
CON TRỎ (Pointer)
Gán địa chỉ
P = &x; // p = x; Error
Truy xuất nội dung biến
*p = *p – 12;
p = &y;
y – = 15;
x += 20;
P = (int*)malloc(sizeof(int));
*P = x – 10;
Free(p);
Khai báo biến và khởi tạo
int x = 8, y = 10;
Khai báo biến pointer
int *p;
x
0xFA30
y
0xFA32
????
p
????
0xFA30 0xFA32
NULL
8 10
- 4
- 5
16
6 ?
// x = *p = – 4 , y = 10
// y = *p = 10 , x = – 4
// y = *p = – 5 , x = – 4
// x = 16 , y = *p = – 5
// *p = 6, x = 16, y = – 5
0xAA00
// p = NULL
???? 0xAA00
????
HÀM
(FUNCTION)
Chương 8:
Function
Hm l mt đon chương trnh đc
lp thc hin trn vn mt công vic nht
đnh, sau đ tr v gi tr cho chương
trnh gi n.
Hay ni cch khc hm l s chia
nh ca chương trnh.
Khái niệm
Function
Ví dụ:
#include <stdio.h>
#include <conio.h>
// Prototype
void HoanDoi (int& a, int& b);
//
void main()
{
int a,b;
clrscr();
printf("Nhap vao 2 so nguyen A,B: ");
scanf("%d %d",&a,&b);
printf("Truoc khi hoan doi: A=%d va B=%d\n",a,b);
HoanDoi(a,b);
printf("Sau khi hoan doi: A=%d va B=%d\n",a,b);
getch();
}
//
void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Function
<Kiu d liệu trả về> Tên hàm([ danh sách các tham s]);
Với:
Kiu d liệu : int, float, char, struct (void: không kiu)
Tên hàm : người lập trình tự đặt tên theo qui tắc như tên Biến.
Ví dụ:
void HoanDoi (int& a, int& b);
Khai báo
Function
<Kiểu trả về> Tên_hm (danh sch cc tham s)
{
Khai bo cc bin cc b
Cc câu lnh / khi lnh hay li gi đn hm khc.
}
Cách Khai báo biến trong hàm:
#include <stdio.h>
#include <conio.h>
// Prototype
void HoanDoi (int& a, int& b);
//
void main()
{
int a,b;
clrscr();
printf("Nhap vao 2 so nguyen A,B: ");
scanf("%d %d",&a,&b);
printf("Truoc khi hoan doi: A=%d va B=%d\n",a,b);
HoanDoi(a,b);
printf("Sau khi hoan doi: A=%d va B=%d\n",a,b);
getch();
}
//
void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Function
Truyền tham s hàm:
1.Truyền Tham Trị: Bên trong giá trị các
tham số thay đổi, nhưng ra khỏi hàm vẫn
không đổi.
Ví dụ:
int Tinh (int a)
{
int temp;
a = a+3;
temp = 2*(a+4);
return temp;
}
Truyền Tham TRỊ
Function
Truyền tham s hàm:
2.Truyền Tham Chiếu (&): Bên trong giá trị các
tham số thay đổi, ra khỏi hàm bị thay đổi theo.
Ví dụ:
void HoanDoi (int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Truyền Tham CHIẾU
Function
Truyền tham s hàm:
3.Truyền Tham Biến (*): Bên trong giá trị các
tham số thay đổi, ra khỏi hàm bị thay đổi theo.
Ví dụ:
void HoanDoi (int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
Truyền Tham BiẾN
Cơ chế giống Tham
Chiếu, nhưng cách
viết theo con trỏ
Function
Hàm Đệ quy:
Ngôn ngữ C cho phép từ trong thân của mt hm có li gi hm
chính hm đó. Hàm như vậy gọi là hàm đệ qui.
Khi hàm gọi đệ qui đến chính nó, thì mỗi lần gọi, máy sẽ tạo ra một tập
các biến cục bộ mới hoàn toàn độc lập với tập các biến cục bộ đã được
tạo ra trong các lần gọi trước.
Ví dụ:
#include<conio.h>
#include<stdio.h>
// Prototype
unsigned long GiaiThua(int n);
unsigned long GiaiThuaDQ(int n);
//
void main()
{
int n;
printf(“Nhap n = ”);
scanf(“%d”,&n);
printf(" %d!=%lu", n, GiaiThua(n) );
printf(" %d!=%lu", n, GiaiThuaDQ(n) );
getch( );
}
//
unsigned long GiaiThua(int n) // Tính n! với n>=0
{
unsigned long gt=1;
for (int i=2; i<=n; i++)
gt *=i;
return gt;
}
//
unsigned long GiaiThuaDQ(int n)
{
if (n==0 || n==1)
return 1;
else
return (n*GiaiThuaDQ(n-1));
}
MẢNG
(ARRAY)
Chương 9:
MẢNG MỘT CHIỀU (One-dimensional array)
Khái niệm
Khai báo
Khởi tạo mảng
Chỉ s – giá trị – địa chỉ của phần tử mảng
Truyền mảng qua tham s của hàm
Các thao tác trên mảng
Nội dung
MẢNG MỘT CHIỀU (One-dimensional array)
Khái niệm
Khai báo
Khởi tạo mảng
Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
Truyền mảng qua tham s của hàm
Các thao tác trên mảng
Nội dung
Khái niệm
3
0 1 2 3 4
CHỖ
ĐẬU XE
Tất cả
xe này
của
tôi
3
One-dimensional array
Mng l nhm cc phần tử cùng kiểu dữ liu v c chung tên.
Mỗi phần tử l mt biến thnh phần ca mng được qun lý
bằng chỉ số(index) bắt đầu từ 0 (liên tiếp, tăng mt đơn v).
Như vy để truy xut mt phần tử ca mng, chúng ta phi
biết được chỉ số ca n.
Trong b nhớ, cc phần tử ca mng được cp pht cc ô nhớ
c đa chỉ liên tiếp khc nhau.
Khái niệm
MẢNG MỘT CHIỀU (One-dimensional array)
Khi nim
Khai báo
Khởi tạo mảng
Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
Truyền mảng qua tham s của hàm
Các thao tác trên mảng
Nội dung
One-dimensional array
< Kiu d liệu > < Tên mảng > [ < S phần tử ti đa của mảng> ] ;
Với:
Kiu d liệu : int, float, char, struct, pointer
Tên mảng : người lập trình tự đặt tên theo qui tắc như tên Biến. Tên
mảng thực chất là một hằng địa chỉ của phần tử đầu tiên.
S phần tử ti đa của mảng : là hằng s nguyên cụ th.
Ví dụ:
int a[100]; // Khai bo mảng s nguyên a gồm 100 phần tử
#define MAX 50
float b[MAX]; // Khai bo mảng s thực b gồm 50 phần tử
const int n = 10; // n l bin hằng
char str[n]; // Error, n không phải l hằng s nguyên c thể
long c[]; // Error, phải khai bo s phần tử ti đa của mảng
Khai báo
dạng con trỏ hằng (constant pointer)
One-dimensional array
< Kiu d liệu > *< Tên mảng >;
Lưu ý: Tên mảng tại thời điểm khai báo này thực chất là biến
(pointer) đang chỉ đến vùng nhớ (k cả giá trị tại vùng nhớ đó)
không tường minh. Để chính thức là mảng cần thao tác thêm:
Cách 1: cùng quản lý chung với mảng đã tồn tại
Ví dụ :
int *p; // khai bo con trỏ p
int b[100];
p = b; // p trỏ vo phần tử tại vị trí 0 của mảng b
Với cách viết này có thể hiểu các cách viết sau là tương đương:
p[i] *(p + i) b[i] *(b+i)
Khai báo
dạng Con trỏ động (Pointer) (1)
??
??
?
p
??
Cách 2:
Xin cấp phát một vùng nhớ động đ con trỏ thành mảng động.
- Dng hàm malloc trong thư vin <stdlib.h>
Ví dụ:
int *px; // Khai bo con trỏ px
px = (int*) malloc(10*sizeof(int)); // Cấp pht 10 ô nhớ kiểu int
Chú ý:
Sau khi s dụng xong thì nên giải phóng vng nhớ bng hàm free
V d : free (px) ; // giải phóng vùng nhớ cho con trỏ px
One-dimensional array
Khai báo
dạng Con trỏ động (dynamic array) (2)
????
?
px
????
px
0xFA30
MẢNG MỘT CHIỀU (One-dimensional array)
Khi nim
Khai báo
Khởi tạo mảng
Chỉ s(index)–Giá trị(value)–Địa chỉ(address)
của phần tử mảng
Truyền mảng qua tham s của hàm
Các thao tác trên mảng
Nội dung
One-dimensional array
S lượng các giá trị được khởi tạo bằng đúng với s phần tử khai
báo trong mảng.
Ví dụ: int a[5] = { 1, 2, 3, 4, 5 };
S lượng các giá trị được khai báo nếu ít hơn s phần tử của
mảng, thì các phần tử còn lại của mảng sẽ được khởi tạo bằng 0.
Ví dụ: int a[5] = { 1, 2 }; // int a[5] = { 1, 2, 0, 0, 0 };
S phần tử của mảng không được chỉ định, thì s phần tử khởi tạo
sẽ xác định kích thước của mảng.
Ví dụ: int a[ ] = { 1, 2, 3, 4, 5 }; // s phần tử của mảng a bằng 5
Khởi tạo giá trị của tất cả các phần tử trong mảng bằng một giá trị
hằng.
Ví dụ: int a[10] = {0};//gi trị tất cả cc phần tử của mảng a bằng 0
Khởi tạo mảng
MẢNG MỘT CHIỀU (One-dimensional array)
Khi nim
Khai báo
Khởi tạo mảng
Chỉ s – giá trị – địa chỉ của phần tử mảng
Truyền mảng qua tham s của hàm
Các thao tác trên mảng
Nội dung
One-dimensional array
Ví dụ:
#define MAX 10
int a[MAX] = {5, 3, -2, 6, 3, -3, 9, 8, 44, 6};
int *pa;
pa = a; // tương đương pa = &a[0];
a
0xFA30
pa
0xFA30
Chỉ s (index)–giá trị (value)–địa chỉ(address) của phần tử mảng
One-dimensional array
Cách truy xuất giá trị và địa chỉ của các phần tử của mảng a
hay con trỏ pa là tương đương
Index – Value – Address của phần tử mảng (tiếp theo)