LATEST

Tham trị và tham chiếu trong C / C++

Trong bài viết này, codehow sẽ giới thiệu đến các bạn hai khái niệm tham trị và tham chiếu trong C / C++. Khi sử dụng hàm các bạn cần biết được tham trị và tham chiếu là gì? cách sử dụng nó như thế nào trong C / C++.

Cả hai đều có cùng chung một mục đích là truyền tham số vào trong hàm, tuy nhiên về tính chất của nó thì hoàn toàn khác nhau.

bai21 1 png

Như các bạn đã thấy trên hình, khi gọi theo kiểu tham chiếu thì giá trị ban đầu sẽ bị thay đổi. Còn gọi theo kiểu tham trị thì sẽ không làm thay đổi giá trị của biến khi hàm kết thúc.

Nghĩa là nếu gọi theo kiểu tham trị, trong hàm chúng ta có thay đổi giá trị của biến tham số đi chăng nữa thì khi kết thúc hàm vẫn giữ nguyên giá trị ban đầu.

Để hiểu rõ hơn, các bạn cùng mình tìm hiểu thông quá các ví dụ thực tế trong ngôn ngữ C và C++ nhé.

Cách gọi hàm kiểu tham trị và tham chiếu trong C / C++

Trong phần này mình sẽ thực hiện các ví dụ để gọi hàm theo kiểu tham trị và tham số trong C / C++. Như vậy các bạn có thể tự so sánh được sự giống nhau và khác nhau trước khi đi vào phần tiếp theo bến dưới.

Gọi hàm theo kiểu tham trị trong C / C++

Khi chúng ta gọi hàm theo kiểu tham trị thì giá trị ban đầu sẽ không bị thay đổi cho dù chúng ta tác động đến giá trị của tham số. Để hiểu rõ hơn, mình có một ví dụ như dưới đây.

Ví dụ:

Mình sẽ viết một hàm show() nhận vào tham số int i. Trong hàm show() sẽ gán giá trị i = 10, sau đó hiển thị giá trị i trong hàm ra màn hình. Trong hàm main() sẽ khai báo biến i = 1, thực hiện hiển thị biến i trước và sau khi gọi hàm để xem kết quả có thay đổi hay không.

Chương trình C:

#include <stdio.h>
void Show(int i)  
{  
    i = 10;  
    printf("Giá trị của biến i bên trong hàm, i = %d\n", i);
}
int main(void) {
  int i = 1;  
    printf("Giá trị của biến i trước khi truyền vào hàm, i = %d\n", i);
    Show(i);  
    printf("Giá trị của biến i sau khi truyền vào hàm, i = %d\n",i);

    printf("\n----------------------------------\n");
    printf("Chương trình này được đăng tại codehow.net");
  return 0;
}

Chương trình C++:

#include <iostream>  
using namespace std; 
 
void Show(int i)  
{  
    i = 10;  
    cout << "Giá trị của biến i bên trong hàm, i = " << i << endl;
}
 
int main()  
{  
    int i = 1;  
    cout << "Giá trị của biến i trước khi truyền vào hàm, i = " << i << endl;
    Show(i);  
    cout << "Giá trị của biến i sau khi truyền vào hàm, i = " << i << endl;

    cout<<"\n----------------------------------\n";
    cout<<"Chương trình này được đăng tại codehow.net";
    return 0;  
}

Kết quả:

bai21 2 png

Như các bạn thấy thì khi chúng ta thay đổi giá trị của tham số trong hàm, thì gọi hàm theo kiểu tham trị sẽ không làm thay đổi giá trị của tham số trong hàm.

Gọi hàm theo kiểu tham chiếu trong C / C++

Như đã nói thì gọi hàm theo kiểu tham chiếu sẽ làm thay đổi giá trị của tham số trong hàm khi chúng ta tác động vào nó. Vì sao lại như vậy là bởi chúng ta truyền vào địa chị nơi lưu trữ nó chứ không phải truyền vào giá trị của nó.

Kiến thức này các bạn sẽ được học ở bài con trỏ trong C / C++, còn bây giờ các bạn tạm thời hiểu rằng để truyền địa chỉ vào ta cần thêm dấu * trước tham số nhé.

Bây giờ hãy xem ví dụ dưới đây để hiểu rõ hơn nhé.

Ví dụ:

Mình sẽ viết một hàm swap() để hoán đổi giá trị của hai số x và y. Yêu cầu người dùng nhập vào hai số x và y, sau đó gọi hàm swap() để hoán đổi giá trị giữa hai số đó.

Chương trình C:

#include <stdio.h>
void swap(int *x, int *y)  
{  
    int swap;  
    swap=*x;  
    *x=*y;  
    *y=swap;  
}  
int main(void) {
    int x;
    int y;
    printf("Nhập vào số x: ");
    scanf("%d", &x);
    printf("Nhập vào số y: ");
    scanf("%d", &y);
    printf("Giá trị của x trước khi gọi hàm, x = %d\n", x);
    printf("Giá trị của y trước khi gọi hàm, y = %d\n", y);
    swap(&x, &y);  
    printf("Giá trị của x sau khi gọi hàm, x = %d\n", x);
    printf("Giá trị của y sau khi gọi hàm, x = %d\n", y);

    printf("\n----------------------------------\n");
    printf("Chương trình này được đăng tại codehow.net");
  return 0;
}

Chương trình C++:

#include <iostream>  
using namespace std; 
 
void swap(int *x, int *y)  
{  
    int swap;  
    swap=*x;  
    *x=*y;  
    *y=swap;  
}  
 
int main()  
{  
    int x;
    int y;
    cout<<"Nhập vào số x: ";
    cin>>x;
    cout<<"Nhập vào số y: ";
    cin>>y;
    cout << "Giá trị của x trước khi gọi hàm, x = " << x << endl;
    cout << "Giá trị của y trước khi gọi hàm, y = " << y << endl;
    swap(&x, &y);  
    cout << "Giá trị của x sau khi gọi hàm, x = " << x << endl;
    cout << "Giá trị của y sau khi gọi hàm, y = " << y << endl;

    cout<<"\n----------------------------------\n";
    cout<<"Chương trình này được đăng tại codehow.net";
    return 0;  
}

Kết quả:

bai21 3 png

So sánh giữa tham trị và tham chiếu trong C / C++

Về cơ bản thì tham trị và tham chiếu trong C / C++ là hai kiểu truyền tham số trong hàm. Tùy vào bài toán mà chúng ta sử dụng kiểu nào để sử dụng.

Còn về sự khác nhau giữa chúng thì các bạn có thể xem qua bảng dưới đây:

Tham trị Tham chiếu
Tham số hình thức và tham số thực tế khác địa chỉ trong bộ nhớ Tham số hình thức và tham số thực tế cùng một địa chỉ trong bộ nhớ
Thay đổi giá trị biến bên trong hàm không làm thay đổi giá trị biến truyền vào hàm Thay đổi giá trị biến bên trong hàm sẽ làm thay đổi giá trị biến truyền vào hàm
Là bản sao giá trị của biến truyền vào hàm Là địa chỉ của biến được truyền vào hàm

Ví dụ gọi hàm kiểu tham trị và tham chiếu trong C / C++

Trong phần này mình sẽ thực hiện một vài ví dụ về tham trị và tham chiếu trong C / C++. Mình sẽ viết bằng hai ngôn ngữ khác nhau là C và C++ để các bạn có thể so sánh và sử dụng nhé.

Ví dụ 1: Viết hàm max() nhận vào ba tham số *x, *y, *z (tham chiếu). Hàm có chức năng hoán đổi luôn cho biến x là giá trị lớn nhất, biến y là giá trị lớn nhì và biến z là giá trị nhỏ nhất. Hiển thị các biến trước và sau khi gọi hàm.

#include <iostream>  
using namespace std; 
 
void max(int *x, int *y, int *z)  
{  
    int max1, max2, min;
    if(*x > *y && *x > *z){
      max1 = *x;
      if(*y > *z){
        max2 = *y;
        min = *z;
      }
      else if(*y < *z){
        max2 = *z;
        min = *y;
      }
    } 
    else if(*y > *z && *y > *x)
    {
      max1 = *y;
      if(*x > *z){
        max2 = *x;
        min = *z;
      }
      else if(*x < *z){
        max2 = *z;
        min = *x;
      }
    }
    else if(*z > *y && *z > *x)
    {
      max1 = *z;
      if(*x > *y){
        max2 = *x;
        min = *y;
      }
      else if(*x < *y){
        max2 = *y;
        min = *x;
      }
    }
    *x = max1;
    *y = max2;
    *z = min;
    
}  
 
int main()  
{  
    int x;
    int y;
    int z;
    cout<<"Nhập vào số x: ";
    cin>>x;
    cout<<"Nhập vào số y: ";
    cin>>y;
    cout<<"Nhập vào số z: ";
    cin>>z;
    cout << "Giá trị của x trước khi gọi hàm, x = " << x << endl;
    cout << "Giá trị của y trước khi gọi hàm, y = " << y << endl;
    cout << "Giá trị của z trước khi gọi hàm, z = " << z << endl;
    max(&x, &y, &z);  
    cout << "Giá trị của x sau khi gọi hàm, x = " << x << endl;
    cout << "Giá trị của y sau khi gọi hàm, y = " << y << endl;
    cout << "Giá trị của z sau khi gọi hàm, z = " << z << endl;

    cout<<"\n----------------------------------\n";
    cout<<"Chương trình này được đăng tại codehow.net";
    return 0;  
}

Kết quả:

bai21 4 png

Ví dụ 2: Viết hàm tính chu vi hình chữ nhật, tính toán và hiển thị kết quả ra màn hình.

#include <stdio.h>
int ChuViHCN(int x, int y)  
{  
    return (x + y) * 2; 
}  
int main(void) {
    int x;
    int y;
    printf("Nhập vào chiều dài x: ");
    scanf("%d", &x);
    printf("Nhập vào chiều dài y: ");
    scanf("%d", &y);
    printf("Chu vi hình chữ nhật là: %d", ChuViHCN(x, y));

    printf("\n----------------------------------\n");
    printf("Chương trình này được đăng tại codehow.net");
  return 0;
}

Kết quả:

bai21 5 png

Lời kết

Như vậy là chúng ta đã cùng nhau tìm hiểu về tham trị và tham chiếu trong C / C++. Đây là các kiến thức rất quan trọng vì vậy các bạn hãy luyện tập thật nhiều để nắm vững nó nhé. Ở bài tiếp theo mình sẽ hướng dẫn các bạn giải các bài tập sử dụng hàm trong C / C++, chú ý theo dõi nhé !!!

Cùng chuyên mục:

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Sử dụng đệ quy để giải bài toán tháp Hà Nội

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy tương hỗ (Mutual Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy lồng (Nested Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy đa tuyến (Exponential Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy nhị phân (Binary Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy đuôi (Tail Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Đệ quy tuyến tính (Linear Recursion) trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Hàm đệ quy là gì? Các loại hàm đệ quy trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp Quick Sort trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp trộn (Merge Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chọn (Selection Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp chèn (Insertion Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán sắp xếp nổi bọt (Bubble Sort) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nội suy (Interpolation Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm nhị phần (Binary Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán tìm kiếm tuyến tính (Linear Search) trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra năm nhuận trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán kiểm tra số chẵn lẻ trong C / C++

Thuật toán tính lũy thừa trong C / C++

Thuật toán tính lũy thừa trong C / C++

Top