Contents
Mẹo về Tham chiếu trong lập trình là gì Chi Tiết
Bạn đang tìm kiếm từ khóa Tham chiếu trong lập trình là gì được Update vào lúc : 2022-01-05 22:13:21 . Với phương châm chia sẻ Thủ Thuật về trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi đọc Post vẫn ko hiểu thì hoàn toàn có thể lại phản hồi ở cuối bài để Mình lý giải và hướng dẫn lại nha.
Trong nội dung bài viết này toàn bộ chúng ta sẽ cùng tìm hiểu về 3 cách truyền tham số cho hàm trong lập trình C/C++, với những nội dung sau:
Tham số truyền bằng Tham trị (dùng trong cả C và C++)Tham số truyền bằng Tham chiếu (CHỈ DÙNG trong C++)Tham số truyền bằng Con trỏ (dùng trong cả C và C++)
Hàm trong C/C++ hoạt động và sinh hoạt giải trí theo nguyên tắc:
Khi gọi hàm, 1 bản sao của tham số được tạo ra, tiếp theo đó cấp phép vùng nhớ mới, copy giá trị sang (quy trình này được gọi là shadow copy), và hàm sẽ thao tác với bản sao này. (Trong C++ nó sẽ dùng hàm tạo sao chép để tiến hành quy trình shadow copy này)
Có thể bạn quan tâm: Cách cấp phép và giải phóng bộ nhớ trong lập trình C.
1. Tham số truyền bằng Tham trị (dùng trong cả C và C++)1. Tham số truyền bằng Tham trị (dùng trong cả C và C++)
Khi tham số của hàm được truyền bằng tham trị tức là truyền giá trị cho hàm, khi đi vào hàm sẽ tạo ra 1 vùng nhớ mới và mọi thao tác tính toán chỉ thao tác trên vùng nhớ mới đó, còn vùng nhớ cũ vẫn không thay đổi. Cho nên sau khi thực thi xong, thoát khỏi hàm thì giá trị của biến được truyền vào làm tham số sẽ không còn thay đổi, do không còn ảnh hưởng trực tiếp đến vùng nhớ cũ.
=> Tham trị sẽ không còn làm thay đổi giá trị sau khi kết thúc lời gọi hàm. Do đó, tham trị được sử dụng lúc không còn nhu yếu thay đổi giá trị của tham số truyền vào.
#include
// Truyền tham trị
void Xuly(int a)
a = a + 10;
printf(“Dia chi cua bien a trong ham Xuly: %p.n”, &a);
printf(“Gia tri cua bien a trong ham Xuly: %dn”, a);
int main()
int a = 5;
Xuly( a );
printf(“nDia chi cua bien a trong ham main: %p.n”, &a);
printf(“Gia tri cua bien a trong ham main: %dn”, a);
getchar();
return 0;
Kết quả chương trình
Từ kết quả chạy chương trình những bạn hoàn toàn có thể thấy, địa chỉ của biến a trong hàm XuLy(012FF64C) và trong hàm main(012FF720) là rất khác nhau nên việc tính toán bên trong hàm XuLy sẽ không còn làm ảnh hưởng đến giá trị a ở hàm main.
2. Tham số truyền bằng Tham chiếu (CHỈ DÙNG trong C++)2. Tham số truyền bằng Tham chiếu (CHỈ DÙNG trong C++)
Khi tham số của hàm được truyền bằng tham chiếu tức là truyền địa chỉ cho hàm, do đó khi đi vào hàm mọi thao tác tính toán sẽ tiến hành thực thi trên vùng nhớ cũ, cho nên vì thế sau khi thoát khỏi hàm giá trị đã biết thành thay đổi.
=> Tham chiếu sẽ làm thay đổi giá trị sau khi kết thúc lời gọi hàm. Do đó, tham chiếu được sử dụng khi có nhu yếu thay đổi giá trị của tham số truyền vào.
#include
// Truyền tham chiếu
void Xuly(int &a)
a = a + 10;
printf(“Dia chi cua bien a trong ham Xuly: %p.n”, &a);
printf(“Gia tri cua bien a trong ham Xuly: %dn”, a);
int main()
int a = 5;
Xuly( a );
printf(“nDia chi cua bien a trong ham main: %p.n”, &a);
printf(“Gia tri cua bien a trong ham main: %dn”, a);
system( “pause” );
return 0;
Kết quả chương trình
Từ kết quả chạy chương trình những bạn hoàn toàn có thể thấy, địa chỉ của biến a trong hàm XuLy và hàm main là giống nhau(00AFFA20) nên việc tính toán bên trong hàm XuLy thì sẽ ảnh hưởng trực tiếp và làm thay đổi giá trị của biến a ở hàm main (cả hai đều bằng 15).
3. Tham số truyền bằng Con trỏ (dùng trong cả C và C++)3. Tham số truyền bằng Con trỏ (dùng trong cả C và C++)
Có thể bạn quan tâm: Cách sử dụng con trỏ trong lập trình C/C++.
#include
// Truyền con trỏ
// *n: toán tử * ở đây biểu thị n là một trong BIẾN CON TRỎ
void Xuly(int *n)
// Bên trong hàm:
// *n: toán tử * dùng để lấy GIÁ TRỊ của biến con trỏ n
*n = *n + 10;
int main()
/*
* Trường hợp biến thường
*/
int a = 5;
// Vì tham số của hàm XuLy là một trong con trỏ, bản chất con trỏ là địa chỉ
// Nên tham số truyền vào hàm XuLy cũng fai là một trong địa chỉ: &a
Xuly( &a );
printf(“Gia tri cua a = %dn”, a);
/*
* Trường hợp biến con trỏ
*/
// Cấp phát vùng nhớ cho con trỏ
int *b = (int *)malloc( sizeof(int *) );
// Khởi tạo giá trị cho con trỏ
*b = 5;
// 2 dòng cấp phép và khởi tạo thì TƯƠNG ĐƯƠNG với cùng 1 dòng trong C++ là:
// int *b = new int(5);
// b đã là một trong con trỏ rồi, nên lúc truyền tham số không cần dấu & nữa.
Xuly( b );
printf(“nGia tri cua b = %d”, *b);
// Giải phóng vùng nhớ đã cấp phép
không lấy phí(b);
getchar();
return 0;
Kết quả chương trình
Một số lưu ý ở phần này:
Đối với tham số được truyền bằng con trỏ thì hàm vẫn tiếp tục tuân theo nguyên tắc đã nêu trên và 1 bản sao của con trỏ được tạo ra, và hàm thao tác với bản sao này, và trước lúc gọi hàm con trỏ trỏ vào đâu thì nó vẫn được trỏ vào đấy.
#include
#include
#include
// Tham số truyền bằng con trỏ
void XuLy(int *a)
*a = 2;
a++;
int main()
// Khai báo và cấp phép vùng nhớ cho con trỏ
int *a = (int *)calloc( 1, sizeof(int *) );
printf(“Dia chi Truoc : %xn”, a); // trước và sau khi gọi hàm
XuLy( a ); // con trỏ a trỏ vào đâu
printf(“Dia chi Sau : %xn”, a); // thì nó vẫn trỏ vào đó
// Giải phóng vùng nhớ đã cấp phép
không lấy phí( a );
getchar();
return 0;
Địa chỉ của con trỏ Trước và Sau thực thi hàm là Giống nhau: c70fd8
Vậy con trỏ ko thay đổi thì cái gì thay đổi được?
Đó đó đó là giá trị nằm trong vùng nhớ trỏ đến thay đổi. Do biến a của ta nằm trong vùng nhớ được trỏ đến nên nó được thay đổi.
・ Ví dụ 1:
#include
#include
// Tham số truyền bằng con trỏ
void XuLy(int *a)
*a = 2; // thao tác với địa chỉ nhận được
int main()
int a;
XuLy( &a ); // truyền địa chỉ của a vào cho hàm
printf(“a = %d”, a); // do đó sau hàm này a = 2
getchar();
return 0;
・ Ví dụ 2:
#include
#include
#include
// Tham số truyền bằng con trỏ
void XuLy(int *a)
*a = 2; // thao tác với địa chỉ nhận được
int main()
// Khai báo và cấp phép vùng nhớ cho con trỏ
int *a = (int *)calloc(1, sizeof(int *));
printf(“Truoc a = %dn”, *a);
XuLy( a ); // truyền địa chỉ của a vào cho hàm
printf(“Sau a = %dn”, *a); // do đó sau hàm này a = 2
// Giải phóng vùng nhớ đã cấp phép
không lấy phí(a);
getchar();
return 0;
Giá trị của biến a được thay đổi
Tránh thao tác sai như sau:
Ban đầu con trỏ chưa trỏ đến đâu cả và được truyền vào hàm. Trong hàm toàn bộ chúng ta cấp phép bộ nhớ rồi cho bản sao đang thao tác trỏ đến. Sau đó thoát khỏi hàm rồi thì con trỏ a của ta vẫn chưa tồn tại trỏ vào bộ nhớ nào cả, nên lúc truy xuất vào giá trị của con trỏ a sẽ bị lỗi.
#include
#include
void XuLy( int *a )
// Cấp phát bộ nhớ cho con trỏ bên trong hàm được gọi
// nên sẽ không còn liên quan gì đến vùng nhớ của con trỏ a ở hàm main
a = ( int * )calloc( 1, sizeof(int) );
*a = 2;
printf( “a = %dn”, *a ); // Output: a = 2
int main()
int *a = NULL;
XuLy( a );
// Kiểm tra con trỏ có NULL hay là không
if ( a )
printf( “Not NULL” );
else
printf( “NULL” ); // Output: NULL
printf( “a = %dn”, *a ); // Xảy ra lỗi run-time,
// ném ra 1 exception vì con trỏ a là con trỏ null
getchar();
return 0;
Vì truyền tham chiếu hay truyền con trỏ cho hàm đều làm thay đổi giá trị của biến tham số sau khi thoát khỏi hàm. Do đó toàn bộ chúng ta hoàn toàn có thể ứng dụng khi muốn lấy nhiều kết quả trả về từ là 1 hàm. Ví dụ:
#include
// Truyền tham chiếu
void TinhToan_1(int a, int b, int &Tong, int &Hieu, int &Tich)
Tong = a + b;
Hieu = a – b;
Tich = a * b;
// Truyền con trỏ
// *Tong, *Hieu, *Tich: toán tử * ở đây biểu thị đấy là 3 CON TRỎ Tong, Hieu Tich
void TinhToan_2(int a, int b, int *Tong, int *Hieu, int *Tich)
// Bên trong hàm:
// *Tong, *Hieu, *Tich: toán tử * dùng để lấy 3 GIÁ TRỊ của con trỏ Tong, Hieu Tich
*Tong = a + b;
*Hieu = a – b;
*Tich = a * b;
int main()
int a = 9;
int b = 3;
int Tong1, Hieu1, Tich2;
int Tong2, Hieu2, Tich2;
// Gọi hàm tính toán
TinhToan_1( a, b, Tong1, Hieu1, Tich2 );
TinhToan_2( a, b, &Tong2, &Hieu2, &Tich2 );
// Lấy được 3 giá trị kết quả tổng, hiệu, tích
printf(“Tong cua hai so %d va %d la: %d, %dn”, a, b, Tong1, Tong2);
printf(“Hieu cua hai so %d va %d la: %d, %dn”, a, b, Hieu1, Hieu2);
printf(“Tich cua hai so %d va %d la: %d, %dn”, a, b, Tich2, Tich2);
system( “pause” );
return 0;
Kết quả chương trình
Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!4.4 7 votesĐánh giá nội dung bài viết
://.youtube/watch?v=Fn284ZNWHAc
Reply
9
0
Chia sẻ
Clip Tham chiếu trong lập trình là gì ?
Bạn vừa Read tài liệu Với Một số hướng dẫn một cách rõ ràng hơn về Clip Tham chiếu trong lập trình là gì tiên tiến và phát triển nhất
Bạn đang tìm một số trong những Chia Sẻ Link Down Tham chiếu trong lập trình là gì miễn phí.
Thảo Luận vướng mắc về Tham chiếu trong lập trình là gì
Nếu sau khi đọc nội dung bài viết Tham chiếu trong lập trình là gì vẫn chưa hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Ad lý giải và hướng dẫn lại nha
#Tham #chiếu #trong #lập #trình #là #gì