intTypePromotion=1
ADSENSE

HÀM VỚI ĐỐI SỐ BẤT ĐỊNH TRONG C

Chia sẻ: Le Hai | Ngày: | Loại File: DOC | Số trang:4

231
lượt xem
25
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Trong các giáo trình C thường chỉ hướng dẫn cách xây dựng hàm với các đối cố định. Mỗi đối cần có một tham số (cùng kiểu với nó) trong lời gọi hàm. Tuy nhiên một vài hàm chuẩn của C lại không như vậy, mà linh hoạt hơn, chẳng khi dùng hàm printf hay scanf thì số tham số mà ta cung cấp cho hàm là không cố định cả về số lượng lẫn kiểu cách. Ví dụ trong câu lệnh:

Chủ đề:
Lưu

Nội dung Text: HÀM VỚI ĐỐI SỐ BẤT ĐỊNH TRONG C

  1. PHỤ LỤC 4 Các phép toán quan trọng trên con trỏ gồm: HÀM VỚI ĐỐI SỐ BẤT ĐỊNH TRONG C + Gán địa chỉ một vùng nhớ cho con trỏ (dùng toán tử gán, phép lấy địa chỉ, các hàm cấp phát bộ nhớ) Trong các giáo trình C thường chỉ hướng dẫn cách xây d ựng + Truy nhập vào vùng nhớ thông qua con trỏ, dùng phép toán: hàm với các đối cố định. Mỗi đối cần có một tham số (cùng ki ểu với nó) trong lời gọi hàm. Tuy nhiên một vài hàm chuẩn của C l ại *Tên_con_trỏ không như vậy, mà linh hoạt hơn, chẳng khi dùng hàm printf hay (Để ý ở đây có 2 vùng nhớ: vùng nhớ của biến con trỏ và vùng scanf thì số tham số mà ta cung cấp cho hàm là không cố định c ả nhớ mà địa chỉ đầu của nó chứa trong biến con trỏ) về số lượng lẫn kiểu cách. Ví dụ trong câu lệnh: + Cộng địa chỉ để con trỏ chứa địa chỉ c ủa phần tử ti ếp theo, printf(“\n Tổng = %d “ , 3+4+5) ; dùng phép toán: có 2 tham số, nhưng trong câu lệnh: ++ Tên_con_trỏ hoặc Tên_con_trỏ ++ printf(“\n Hà Nội“ ) ; Chú ý rằng các phép toán trên chỉ có thể thực hiện đối với con trỏ có kiểu. chỉ có một tham số. Như vậy cần phân biệt các khái niệm sau: 2. Danh sách không cùng kiểu - Đối số cố định được khai báo trong dòng đầu của hàm, nó có Dùng con trỏ có kiểu chỉ quản lý được một danh sách giá trị tên và kiểu cùng kiểu, ví dụ dẫy số thực, dẫy số nguyên, dẫy các cấu trúc,.... - Tham số ứng với đối số cố định gọi là tham số cố định Khi cần quản lý một danh sách các giá trị không cùng kiểu ta phải dùng con trỏ không kiểu (void) khai báo như sau: - Đối bất định được khai báo bởi ba dấu chấm: bất định c ả v ề số lượng và kiểu void * Tên_con_trỏ ; Con trỏ void có thể chứa các địa chỉ có kiểu bất kỳ, và dùng đ ể - Tham số bất định (ứng với đối bất định) là m ột danh sách giá trỏ đến vùng nhớ chứa danh sách cần quản lý. Một chú ý quan trị với số lượng và kiểu tuỳ ý (không xác định) trọng là mỗi khi gửi vào hay lấy ra một giá trị từ vùng nhớ, thì tuỳ Trong phụ lục này sẽ trình bầy cách xây dựng các hàm với đ ối theo kiểu giá trị mà ta phải dùng phép chuyển kiểu thích hợp đối số bất định. Công cụ chủ yếu được dùng là con trỏ và danh sách. với con trỏ. Ví dụ sau minh hoạ cách lập một danh sách gồm một số nguyên, một số thực và một chuỗi ký tự. Chúng ta cần m ột b ộ 1. Biến con trỏ nhớ để chứa số nguyên, số thực và địa chỉ chuỗi và dùng các con Biến con trỏ (hay con trỏ) dùng để chứa địa chỉ của biến, trỏ void để quản lý vùng nhớ này. mảng, hàm, ... Có nhiều kiểu địa chỉ, vì vậy cũng có nhi ều ki ểu void *list , *p ; // Con trỏ list trỏ tới đầu danh sách con trỏ. Biến con trỏ được khai báo theo mẫu: // p dùng để duyệt qua các phần tử của danh sách Kiểu *Tên_biến_con_trỏ ; list=malloc(sizeof(int) + sizeof(float)+ sizeof(char*) ); Ví dụ: p=list; float px ; // px là con trỏ thực 561 562
  2. *((int*)p) = 12; // Đưa số nguyên 12 vào danh sách “3f” hiểu là : tham số bất định gồm 3 giá trị float // Chuyển sang phần tử tiếp theo “fiss” hiểu là có 4 tham số bất định có kiểu lần lượt là float, ((int*)p)++ ; int, char*, char* *((float*)p) = 3.14; // Đưa số thực 3.14 vào danh sách Một khi đã biết được địa chỉ đầu danh sách, biết được số lượng // Chuyển sang phần tử tiếp theo ((float*)p)++ ; và kiểu của mỗi tham số , thì dễ dàng nhận được 563trị các tham giá 564 *((char**)p) = “HA NOI”; // Đưa địa chỉ chuỗi “HA NOI” số để sử dụng trong thân hàm. // vào danh sách Ví dụ sau đây minh hoạ cách xây dựng các hàm với tham số bất // Nhận các phần tử trong danh sách định. Hàm dùng để in các giá trị kiểu int, float và char. Hàm có m ột tham số cố định để cho biết có bao nhiêu giá trị và kiểu các giá trị p=list; // Về đầu danh sách cần in. Kiểu quy định như sau: i là int, f là float, s là char*. Tham int a = *((int*)p); // Nhận phần tử thứ nhất số có 2 cách viết: lặp (gồm một hằng số nguyên và một chữ cái ((int*)p)++ ; // Chuyển sang phần tử tiếp theo định kiểu) và liệt kê (một dẫy các chữ cái định kiểu). Ví dụ: float x= *((float*)p); // Nhận phần tử thứ hai “4s” có nghĩa in 4 chuỗi ((float*)p)++ ; // Chuyển sang phần tử tiếp theo “siif” có nghĩa in một chuỗi, 2 giá trị nguyên và m ột giá tr ị thực: char *str = *((char**)p) ; // Nhận phần tử thứ ba #include 3. Hàm với đối số bất định #include + Đối bất định bao giờ cũng đặt sau cùng và được khai báo #include bằng dấu ba chấm. Ví dụ ví dụ hàm #include void f(int n, char *s, ...) ; #include có 2 đối cố định là n, s và đối bất định. #include + Để nhận được các tham số bất định trong lời gọi hàm ta c ần void InDanhSachGiaTri(char *st,...) lưu ý các điểm sau: { - Các tham số bất định chứa trong một danh sách. Để nhận void *list ; được địa chỉ đầu danh sách ta dùng một con trỏ void và phép gán int gt_int ; sau: float gt_float; void *list ; char *gt_str; list = ... ; int n,i ; - Dùng một tham số cố định kiểu chuỗi để quy định số lượng char kieu; và kiểu của mỗi tham số trong danh sách, ví dụ: int lap; “3i” hiểu là : tham số bất định gồm 3 giá trị int list = ... ; // list tro toi vung nho chua danh sach dia chi cac
  3. // tham so break; lap = isdigit(st[0]) ; case 's' : if (lap) gt_str = *((char**)list) ; n=st[0] - '0' ; if(!lap) else ((char**)list)++ ; n=strlen(st); printf("\nGia tri %d = %s",i,gt_str); 565 566 printf("\n n= %d lap = %d",n,lap); getch(); } for(i=0;i
  4. dùng các biến toàn bộ. Rõ ràng giải pháp này không không thuận tiện cho người dùng vì phải khai báo đúng tên biến toàn bộ và phải khởi gán giá trị cho nó trước khi gọi hàm. Ví dụ trình bầy một hàm chỉ có đối bất định dùng để tính max và min của các giá trị th ực. Các tham số bất định được đưa vào theo trình tự sau: Địa chỉ chứa max, địa chỉ chứa min, các giá trị nguyên c ần tính max, min. Chương trình dùng biến toàn bộ N để cho bi ết số giá tr ị nguyên cần tính max, min. int N; void maxmin() 567 { void *lt = ... ; float *max, *min , tg; int i; max = *((float**)lt)++; min = *((float**)lt)++; *max = *min = (float) *((double*)lt)++; for(i=1;i *max) *max = tg; if(tg < *min) *min = tg; } }
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD


intNumView=231

 

Đồng bộ tài khoản
2=>2