Menu
CoddyTech

Truyền cấu trúc theo giá trị

Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 46 trên 63.

Bây giờ bạn đã biết cách làm việc với struct và con trỏ đến struct, đã đến lúc học cách truyền toàn bộ struct vào hàm. Khi truyền struct vào hàm dưới dạng tham số, C sử dụng cơ chế truyền theo giá trị, nghĩa là hàm nhận được một bản sao hoàn chỉnh của struct.

Đây là cú pháp của một hàm (function) nhận tham số (parameter) kiểu struct:

void functionName(struct StructureName parameterName) {
    // Thân hàm
}

Lấy struct Point quen thuộc làm ví dụ:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Điều quan trọng cần hiểu là mọi thay đổi bạn thực hiện với struct bên trong hàm sẽ không ảnh hưởng đến struct ban đầu trong hàm gọi. Lý do là hàm thao tác với bản sao dữ liệu riêng.

Cách này hữu ích khi bạn muốn đọc hoặc hiển thị dữ liệu struct mà không lo vô tình sửa đổi dữ liệu gốc. Tuy nhiên, hãy nhớ rằng việc sao chép các struct lớn có thể kém hiệu quả về bộ nhớ và hiệu năng.

challenge icon

Thử thách

Dễ

Tạo một chương trình C minh họa cách truyền cấu trúc vào hàm theo giá trị. Chương trình của bạn cần:

  1. Định nghĩa một struct tên là Rectangle với các thành viên sau:
    • Một số nguyên width để lưu chiều rộng của hình chữ nhật
    • Một số nguyên height để lưu chiều cao của hình chữ nhật
    • Một mảng ký tự color có kích thước 15 để lưu màu của hình chữ nhật
  2. Viết một hàm (function) tên là displayRectangle để:
    • Nhận một cấu trúc Rectangle làm tham số (truyền theo giá trị)
    • In thông tin hình chữ nhật theo đúng định dạng sau:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Tính và in diện tích (chiều rộng × chiều cao)
  3. Viết một hàm tên là modifyRectangle để:
    • Nhận một cấu trúc Rectangle làm tham số (truyền theo giá trị)
    • Nhân đôi cả chiều rộng và chiều cao của hình chữ nhật
    • Đổi màu thành "Modified"
    • In Inside modifyRectangle function:
    • Gọi displayRectangle để hiển thị hình chữ nhật đã chỉnh sửa
  4. Trong hàm main:
    • Tạo một biến Rectangle tên là rect
    • Đọc chiều rộng, chiều cao và màu từ đầu vào, rồi gán chúng cho các thành viên của cấu trúc
    • In Original rectangle:
    • Gọi displayRectangle để hiển thị hình chữ nhật ban đầu
    • Gọi modifyRectangle với hình chữ nhật
    • In After modifyRectangle call:
    • Gọi lại displayRectangle để cho thấy hình chữ nhật ban đầu không thay đổi

Thử thách này minh họa khái niệm quan trọng về truyền theo giá trị với cấu trúc: khi bạn truyền một cấu trúc vào hàm, hàm sẽ nhận được một bản sao đầy đủ của cấu trúc đó. Mọi thay đổi bên trong hàm chỉ ảnh hưởng đến bản sao, không ảnh hưởng đến cấu trúc ban đầu trong hàm gọi.

Tự làm thử

#include <stdio.h>
#include <string.h>

// TODO: Định nghĩa struct Rectangle tại đây

// TODO: Viết hàm (function) displayRectangle tại đây

// TODO: Viết hàm modifyRectangle tại đây

int main() {
    // Đọc đầu vào
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Tạo biến Rectangle và gán các giá trị đầu vào
    
    // TODO: In ra "Original rectangle:" và gọi displayRectangle
    
    // TODO: Gọi modifyRectangle
    
    // TODO: In ra "After modifyRectangle call:" và gọi lại displayRectangle
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch C online