Windows Việt

Cộng Đồng Công Nghệ Thông Tin Việt

Trang ChínhTrang Chính  Sự kiện  Tìm kiếmTìm kiếm  Đăng kýĐăng ký  Đăng NhậpĐăng Nhập  

Share
 
 "cơm thêm " về kiến thức sử dụng con trỏ
Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down 
Tác giảThông điệp
daokiem_votinh64
Member

daokiem_votinh64
Member
Giới tính : Nam
Tuổi : 31
Posts Posts : 556
Coins Coins : 2157
Thanked Thanked : 168
"cơm thêm " về kiến thức sử dụng con trỏ Empty

Hồi sáng thấy Thầy giảng con trỏ hay quá,lên mạng tìm mấy bài để tham khảo thêm.tình cờ thấy được bài này có ý nghĩa ghê.post lên cho anh em thưởng thức.có gì không hiểu thì cứ reply nha.cũng mong các cao thủ trrong forum chỉ giáo thêm.

Hàm có tham số là kiểu con trỏ

#include
void hoan_vi(int a, int b); /*nguyên mẫu hàm, prototype*/
void main()
{
int n= 10,
Int p= 20;
printf("Trước khi gọi hàm : %d %d\n", n, p);
hoan_vi(n,p);
printf("Sau khi gọi hàm : %d %d\n", n, p);
}

void hoan_vi(int a,int b)
{
int t;
printf("Trước khi hoán vị : %d %d\n", a, b);
t=a;
a=b;
b=t;
printf("Sau khi hoán vị : %d %d\n", a, b);
}
Chương trình này hi ển th ị kết quả sau:
Trước khi gọi hàm gi á tr ị l à : 10 20
Trước khi hoán vị gi á tr ị l à: 10 20
Sau khi hoán vị gi á tr ị l à : 10 20
Sau khi gọi hàm gi á tr ị l à: 10 20

=> nhận thấy kết quả trước và sau khi gọi hàm không có sự thay đổi.

Phân tích: Hàm hoan_vi nhận 2 giá trị tham số tương ứng với 2 tham sô hình thức là a và b. Nó sẽ thực hiện việc hoán đổi giá trị của 2 tham số này. Song chúng ta thấy khi quay trở về chương trình chính, chúng ta không thấy dấu vết gì của sự hoán vị này đối với 2 tham số thực sự là n và p.


Thực vậy khi gọi hàm, 2 biến n và p sẽ được sao chép giá trị để dùng cho hàm hoan_vi. Như vậy “hàm sẽ sao ra 1 bản khác để dùng” nên bản gốc không bao giờ bị thay đổi. Hiện tượng sao mượn giá trị này được gọi là sao mượn dùng cục bộ trong hàm ở vị trí 2 tham số hình thức a và b. Đó chính là lí do vì sao kết quả trước và sau khi gọi hàm đều như nhau.
Như thế hàm hoan_vi không giải quyết được yêu cầu đặt ra.

Để giải quyết được vấn đề này chúng ta sẽ sử dụng tham số là con trỏ. Việc thay đổi giá trị của nhiều tham số thông qua các hàm có thể được thực hiện thông qua việc truyền giá trị địa chỉ có tham số đó cho hàm, địa chỉ của tham số chứ không phải giá trị của tham số. Khi đó chúng ta có thể thay đổi được giá trị của tham số đó.

Chúng ta viết lại hàm hoán vị hai biến sử dụng truyền địa chỉ cho hàm:
Code:
#include
void hoan_vi(int *a, int *b);
void main()
{
int n = 10, p = 20;
printf("Trước khi gọi hàm : %d %d\n", n, p);
hoan_vi(&n,&p);
printf("Sau khi gọi hàm : %d %d\n", n, p);
}

void hoan_vi(int *a,int *b)
/* a và b bây giờ là 2 địa chỉ*/

{ int t;
printf("Trước khi hoán vị : %d %d\n", *a, *b);
t= *a; /* t nhận giá trị chứa trong địa chỉ a */
*a = *b;
*b = t;
printf("Sau khi hoán vị : %d %d\n", *a, *b);
}

Kết quả nhận được như mong muốn:
Trước khi gọi hàm : 10 20
Trước khi hoán vị : 10 20
Sau khi hoán vị : 20 10
Sau khi gọi hàm : 20 10

Chúng ta hãy chú ý 2 kí hiệu:
*a đọc là giá trị tại địa chỉ a, là kí hiệu giá trị được lưu trữ trong bộ nhớ có địa chỉ là a.
&a đọc là địa chỉ của a, là kí hiệu địa chỉ bộ nhớ chứa giá trị a.


Câu hỏi đặt ra là : khi nào thì dùng tham số là con trỏ? Thực ra, trong số các tham số của một hàm, ta chia ra làm 2 loại. Loại thứ nhất là các tham số các giá trị cần truyền vào cho hàm, gọi là tham số vào. Loại thứ hai là các tham số dùng để chứa kết quả mới nhận được, gọi là tham số ra. Ví dụ, cần lập một hàm để giải phương trình bậc 2 (ax2 + bx + c = 0), thì các tham số vào sẽ là a,b,c; còn các tham số ra sẽ là các nghiệm x1 và x2. Như thế, các tham số x1 và x2 phải sử dụng kiểu con trỏ để nhận giá trị
“bạn phải nhớ dùm rằng Quan trọng nhất là nếu không dùng con trỏ thì đừng mơ tới chuyện cấp phát động”



tiếp tục về phần xử lý mảng nha:
đây là code có thay đổi chút ít khi xử lý trên mảng (quen thuộc)
[You must be registered and logged in to see this link.]

còn đây là xử lý mảng theo kiểu con trỏ
[You must be registered and logged in to see this link.]

※ Bài viết cùng chuyên mục


Tác giảThông điệp
montecristo
Member

montecristo
Member
Giới tính : Nam
Tuổi : 29
Posts Posts : 20
Coins Coins : 38
Thanked Thanked : 1
"cơm thêm " về kiến thức sử dụng con trỏ Empty

EEEEE Nhiep may` post lai cai link clip cua thay khang dc ko ku????!!!!!! "cơm thêm " về kiến thức sử dụng con trỏ 593288

※ Bài viết cùng chuyên mục


Tác giảThông điệp
Nguyễn Mai Khanh
Member

Nguyễn Mai Khanh
Member
Giới tính : Nam
Tuổi : 30
Posts Posts : 217
Coins Coins : 91
Thanked Thanked : 23
"cơm thêm " về kiến thức sử dụng con trỏ Empty

Đây là trang web trình bày một cách cơ bản về con trỏ. Đọc không hiểu chết liền:
[You must be registered and logged in to see this link.]

※ Bài viết cùng chuyên mục


Tác giảThông điệp
ncptbl
Member

ncptbl
Member
Giới tính : Nam
Tuổi : 28
Posts Posts : 1
Coins Coins : 1
Thanked Thanked : 0
"cơm thêm " về kiến thức sử dụng con trỏ Empty
Bài gửiTiêu đề: ...   "cơm thêm " về kiến thức sử dụng con trỏ EmptyTue 24 Nov 2009, 20:52

đó là bài giảng hả .. sao i sì trong sách teach yourseft C++ in 21 days . Chương 9 : Con trỏ ..

※ Bài viết cùng chuyên mục


Tác giảThông điệp
Sponsored content


"cơm thêm " về kiến thức sử dụng con trỏ Empty

※ Bài viết cùng chuyên mục


 
"cơm thêm " về kiến thức sử dụng con trỏ
Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Windows Việt :: Lưu Trữ :: Lưu Trữ - Các môn học cũ :: Kỹ Thuật Lập Trình-
[Windows Việt] Deverloped by Nguyễn Gia Phú - https://windows.forumvi.com
Powered by © Forumotion.com - phpBB™ version ©phpBB2
Go to top Go to bottom