Khoa công nghệ thông tin bài giảng LẬp trình cơ BẢn biên soạn



tải về 1.56 Mb.
trang17/29
Chuyển đổi dữ liệu30.08.2016
Kích1.56 Mb.
#28834
1   ...   13   14   15   16   17   18   19   20   ...   29

III. Con trỏ hàm


  • Mặc dù một hàm không phải là một biến nhưng nó vẫn chiếm vị trí trong bộ nhớ và ta có thể gán vào vị trí của nó cho một loại biến con trỏ. Con trỏ này trỏ đến điểm xâm nhập vào hàm. Ta gọi đây là con trỏ hàm. Con trỏ hàm có thể sử dụng thay cho tên hàm và việc sử dụng con trỏ cho phép các hàm cũng được truyền như là tham số cho các hàm khác. Để hiểu được các con trỏ hàm làm việc như thế nào, ta cần hiểu một chút về cách biên dịch và gọi một hàm. Khi biên dịch hàm, trình biên dịch chuyển chương trình nguồn sang dạng mã máy và thiết lập một điểm xâm nhập vào hàm (chính là vị trí chỉ thị mã máy đầu tiên của hàm). Khi có lời gọi thực hiện hàm, máy tính sẽ thực hiện một chỉ thị call chuyển điều khiển đến điểm xâm nhập này. Trong trường hợp gọi hàm bằng tên hàm thì điểm xâm nhập này là trị tức thời (gần như là một hằng và không chứa biến nào cả), cách gọi hàm này gọi là cách gọi hàm trực tiếp. Trái lại, khi gọi hàm gián tiếp thông qua một biến trỏ thì biến trỏ đó phải trỏ tới chỉ thị mã máy đầu tiên của hàm đó. Cách gọi hàm thông qua biến trỏ hàm gọi là cách gọi hàm gián tiếp.

  • Một hàm cũng giống như dữ liệu: có tên gọi , có địa chỉ lưu trong bộ nhớ và có thể truy nhập đến hàm thông qua tên gọi hoặc địa chỉ của nó. Con trỏ hàm là một con trỏ chỉ đến địa chỉ của một hàm. Để truy nhập (gọi) hàm thông qua địa chỉ chúng ta phải khai báo một con trỏ chứa địa chỉ này và sau đó gọi hàm bằng cách gọi tên con trỏ.

1. Khai báo


    Cú pháp

(*tên biến hàm)(d/s tham đối);

(*tên biến hàm)(d/s tham đối) = ;

  • Ta thấy cách khai báo con trỏ hàm cũng tương tự khai báo con trỏ biến (chỉ cần đặt dấu * trước tên), ngoài ra còn phải bao *tên hàm giữa cặp dấu ngoặc (). Ví dụ:

float (*f)(int); // khai báo con trỏ hàm có tên là f trỏ đến hàm

// có một tham đối kiểu int và cho giá trị kiểu float.

void (*f)(float, int); // con trỏ trỏ đến hàm với cặp đối (float, int).


  • hoặc phức tạp hơn:

char* (*m[10])(int, char) // khai báo một mảng 10 con trỏ hàm trỏ đến

// các hàm có cặp tham đối (int, char), giá trị trả

// lại của các hàm này là xâu kí tự.


  • Chú ý: phân biệt giữa 2 khai báo: float (*f)(int) và float *f(int). Cách khai báo trước là khai báo con trỏ hàm có tên là f. Cách khai báo sau có thể viết lại thành float* f(int) là khai báo hàm f với giá trị trả lại là một con trỏ float.

2. Sử dụng con trỏ hàm


  • Con trỏ hàm thay tên hàm

  • Để sử dụng con trỏ hàm ta phải gán nó với tên hàm cụ thể và sau đó bất kỳ nơi nào được phép xuất hiện tên hàm thì ta đều có thể thay nó bằng tên con trỏ. Ví dụ như các thao tác gọi hàm, đưa hàm vào làm tham đối hình thức cho một hàm khác … Sau đây là các ví dụ minh hoạ.

  • Ví dụ 4.16: Dùng tên con trỏ để gọi hàm

#include

#include

float bphuong(float x)

{

return x*x;



}

int main()

{

float (*f)(float);



f = bphuong;

printf("Binh phuong cua 3.5 = :%f",f(3.5));

getch();

return 0;

}


  • Con trỏ hàm làm tham đối

  • Ví dụ 4.17: Tham đối của hàm ngoài các kiểu dữ liệu đã biết còn có thể là một hàm. Điều này có tác dụng rất lớn trong các bài toán tính toán trên những đối tượng là hàm toán học như tìm nghiệm, tính tích phân của hàm trên một đoạn ... Hàm đóng vai trò tham đối sẽ được khai báo dưới dạng con trỏ hàm. Ví dụ sau đây trình bày hàm tìm nghiệm xấp xỉ của một hàm liên tục và đổi dấu trên đoạn [a, b]. Để hàm tìm nghiệm này sử dụng được trên nhiều hàm toán học khác nhau, trong hàm sẽ chứa một biến con trỏ hàm và hai cận a, b, cụ thể bằng khai báo float timnghiem(float (*f)(float), float a, float b). Trong lời gọi hàm f sẽ được thay thế bằng tên hàm cụ thể cần tìm nghiệm.

#include

#include

#include

#define EPS 1.0e-6

float timnghiem(float (*f)(float), float a, float b);

float emux(float);

float logx(float);

int main()

{

printf("Nghiem cua e mu x - 2 trên doan [0,1] = ");



printf("%f\n",timnghiem(emux,0,1));

printf("Nghiem cua loga(x) - 1 trên doan [2,3] = ");

printf("%f\n",timnghiem(logx,0,1));

getch();

return 0;

}

float timnghiem(float (*f)(float), float a, float b)



{

float c = (a+b)/2;

while (fabs(a-b)>EPS && f(c)!=0)

{

if (f(a)*f(c)>0) a = c ; else b = c;



c = (a+b)/2;

}

return c;



}

float emux(float x) { return (exp(x)-2); }

float logx(float x) { return (log(x)-1); }

3. Mảng con trỏ hàm


  • Tương tự như biến bình thường các con trỏ hàm giống nhau có thể được gộp lại vào trong một mảng, trong khai báo ta chỉ cần thêm [n] vào sau tên mảng với n là số lượng tối đa các con trỏ; ví dụ sau minh hoạ cách sử dụng này. Dùng mảng con trỏ để lập bảng giá trị cho các hàm : x*x, sin(x), cos(x), exp(x) và sqrt(x). Biến x chay từ 1.0 đến 10.0 theo bước 0.5

  • Ví dụ 4.18:

#include

#include

#include

double bp(double x)

{

return x*x;



}

int main()

{

int i,j;


double x=1.0;

double (*f[6])(double);

f[1]=bp; // hàm bình phương xây dựng ở trên

f[2]=sin; // hàm sin trong math.h

f[3]=cos; // hàm cos trong math.h

f[4]=exp; // hàm exp (e mũ) trong math.h

f[5]=sqrt; // hàm sqrt (căn bậc 2( trong math.h

while (x<=10.0) // Lập bảng

{

printf("\n");



for (j=1;j<=5;++j)

printf("%10.2f ",f[j](x));

x+=0.5;

}

getch();



return 0;

}


Каталог: files -> FileMonHoc
FileMonHoc -> NGÂn hàng câu hỏi lập trình cơ BẢn nhóm câu hỏI 2 ĐIỂM
FileMonHoc -> CHƯƠng 2 giới thiệu về LÝ thuyết số
FileMonHoc -> CÁc hệ MẬt khoá CÔng khai kháC
FileMonHoc -> BỘ MÔn duyệt chủ nhiệm Bộ môn
FileMonHoc -> Khoa công nghệ thông tin cộng hòa xã HỘi chủ nghĩa việt nam
FileMonHoc -> Chủ nhiệm Bộ môn Ngô Thành Long ĐỀ CƯƠng chi tiết bài giảNG
FileMonHoc -> Chủ nhiệm Bộ môn Phan Nguyên Hải ĐỀ CƯƠng chi tiết bài giảNG
FileMonHoc -> Khoa: CÔng nghệ thông tin cộng hòa xã HỘi chủ nghĩa việt nam
FileMonHoc -> MẬt mã khóA ĐỐi xứng lý thuyết cơ bản của Shannon
FileMonHoc -> Khoa cntt cộng hòa xã HỘi chủ nghĩa việt nam

tải về 1.56 Mb.

Chia sẻ với bạn bè của bạn:
1   ...   13   14   15   16   17   18   19   20   ...   29




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2024
được sử dụng cho việc quản lý

    Quê hương