ĐỊ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... KHÁI NIỆM BIẾN CON TRỎLà một biến dùng để lưu đ
Trang 1TIN HỌC ĐẠI CƯƠNG
www.uit.edu.vn
BÀI 9
CON TRỎ VÀ ĐỊA CHỈ MẢNG
HÀM VÀ CHƯƠNG TRÌNH
Trang 3 Qui tắc về kiểu giá trị trong khai báo
NỘI DUNG BÀI CON TRỎ VÀ ĐỊA CHỈ
Trang 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Ỉ
Trang 6TOÁN TỬ ĐỊA CHỈ
Trang 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ỉ đó)
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Ỏ
Trang 9 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ỏ
Trang 11 Sử dụng giá trị lưu tại vùng nhớ mà
z = *p + 3*(*q);
QUI TẮC SỬ DỤNG CON TRỎ
Trang 16 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ự.
Trang 17 Chú ý: Tên mảng chứa địa chỉ phần tử
đầu tiên của mảng
Trang 18printf( "Nhap phan tu A[%d]: " ,i); scanf( "%d" , &A[i]);
} for(i=0; i<N; i++) printf( "%4d" , A[i]);
Trang 19NHẬP XUẤT MẢNG (GIÁN TIẾP)
Trang 20SỰ 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].
Trang 22 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Ỏ
Trang 23 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ó
Trang 25CHƯƠNG TRÌNH MINH HỌA (tt)
Trang 26for ( int i=0; i<N-1; i++)
for ( int j=i+1; j<N; j++)
if (A[i]>A[j]) {
temp=A[i];
A[i]=A[j];
A[j]=temp;
} }
CHƯƠNG TRÌNH MINH HỌA (tt)
Trang 27p=a;
ABC(a);
}
Trang 30ABC(a);
}MẢNG 2 CHIỀU
Trang 34Một chương trình bao gồm một hoặc nhiều hàm Hàm main() là thành phần bắt buộc của chương trình Chương trình bắt đầu thực hiện từ câu lệnh đầu tiên của hàm main() cho đến khi gặp dấu }
cuối cùng của hàm này
Trang 35 Là một đơn vị độc lập của chương trình.
Không cho phép xây dựng một hàm bên
trong một hàm khác
HÀM & CHƯƠNG TRÌNH
Trang 37Không được viết:
int TinhTong( int a, b)
HÀM & CHƯƠNG TRÌNH
Trang 39 KIỂU GIÁ TRỊ CỦA HÀM
Giá trị trả về của hàm được xác định dựa vào mục đích của hàm, và trong thân hàm ta phải trả về đúng kiểu giá trị đã định ban đầu Nếu các hàm không trả về giá trị ta phải khai báo kiểu void.
Trang 40Tên hàm khai báo trong nguyên mẫu và khi viết đầy đủ phải giống nhau.
HÀM & CHƯƠNG TRÌNH
Trang 41Ví dụ: int TinhTong( int a, int *b)
Tham số thực: là các giá trị, biến mà ta ghi
sau tên hàm khi gọi hàm đó để thực hiện.
Ví dụ: f = TinhTong(x, y);
HÀM & CHƯƠNG TRÌNH
Trang 42 Tham chiếu: là các tham số thực truyền
cho tham số hình thức của hàm dưới dạng
&biến hay *biến, ghi nhận lại những kết quả vừa tính toán trong hàm khi kết thúc hàm.
Tham trị: là các tham số thực truyền cho
tham số hình thức của hàm dưới dạng biến, giá trị không bị thay đổi khi hàm kết thúc.
HÀM & CHƯƠNG TRÌNH
Trang 44 Tham số vào: cung cấp giá trị cho hàm.
Tham số ra: lưu kết quả tính toán được
trong hàm.
Lưu ý:
Các tham số ra phải là tham chiếu.
Các tham số vào mà không muốn giá trị
của nó thay đổi khi hàm kết thúc thì phải
được khai báo là tham trị.
HÀM & CHƯƠNG TRÌNH
Trang 45 NỘI DUNG CỦA HÀM
Với thân hàm ta không nên viết một hàm có nội dung quá lớn mà nên chia ra thành nhiều hàm để nội dung được rõ ràng và giảm độ phức tạp của hàm.
VỊ TRÍ KHAI BÁO NỘI DUNG CỦA HÀM
Ta có thể khai báo nội dung của một hàm ở bất cứ vị trí nào và các hàm phải độc lập
Trường hợp khi không khai báo nguyên mẫu
của hàm thì hàm đó phải được viết đầy đủ trước khi có lời gọi đến nó.
HÀM & CHƯƠNG TRÌNH
Trang 46• Nội dung của hàm
Nguyên mẫu của hàm
HÀM & CHƯƠNG TRÌNH
Trang 47} hàm2( ) { // khai báo biến cục bộ
<lệnh>;
}
// khai báo biến toàn cục
void main( ) { // khai báo biến cục bộ
… hàm1( ); // gọi hàm1
hàm2( ); // gọi hàm2
…
TỔ CHỨC CHƯƠNG TRÌNH TRONG C
Trang 48 Cách 2: // khai báo thư viện
hàm1( ); // khai báo nguyên mẫu prototype
hàm1( ) // khai báo chi tiết các hàm
{ // khai báo biến cục bộ
Trang 49 CÁCH TRUYỀN DỮ LIỆU GIỮA CÁC HÀM
Việc truyền dữ liệu và kết quả từ hàm này sang hàm khác được thực hiện trong hai cách:
Sử dụng đối số của hàm.
Sử dụng biến ngoài, biến tĩnh ngoài
HÀM & CHƯƠNG TRÌNH
Trang 50VÍ DỤ VỀ HÀM & CHƯƠNG TRÌNH
Nguyên mẫu của hàm
Trang 53KHÁI NIỆM VỀ CHUỖI KÝ TỰ
Trong ngôn ngữ C, chuỗi ký tự là một
dãy các ký tự đặt trong hai dấu nháy kép
Chuỗi rỗng được ký hiệu bằng hai dấu
nháy kép đi liền nhau : “”
Ví dụ:
Chuỗi “Chào các bạn”
Trang 54 Chuỗi là mảng một chiều mà kiểu
dữ liệu của từng phần tử trong mảng là ký tự
Chuỗi là một con trỏ trỏ đến kiểu ký
tự char
Trang 55KHAI BÁO CHUỖI
CÁC PHƯƠNG PHÁP KHAI BÁO CHUỖI
char sName[100];
char sName[];
char *sName;
Trang 57strset strspn
strlen strncat strncmp strncmpi strncpy
strnicmp strnset strpbrk strrchr strrev
strstr strtok strxfrm struppr _strerror strerror stricmp atoi
atol atof
Trang 60 Ta có thể truyền tham số chuỗi ký tự vào
trong hàm một cách hoàn toàn tương tự như truyền tham số mảng và con trỏ
Ví dụ:
int DemKhTrang( const char *chuoi);
int DemKTThuong( const char *chuoi);
char *ChuyenDoi( const char *chuoi);
Trang 61int i;
int dem=0;
for (i=0; i<strlen(chuoi); i++)
if (chuoi[i]==' ') dem++;
return dem;
}
Trang 62// hàm đếm số ký tự thường trong chuỗi
int DemKTThuong( char chuoi[])
Trang 63char *kq; strcpy(kq, chuoi);
for ( int i=0; kq[i]!='\0'; i++)
if ((kq[i]>='a') && (kq[i]<='z'))
Trang 64www.uit.edu.vn