Con trỏ cấu trúc trong c | Laptrinhcanban.com

Con trỏ cấu trúc trong c

Cùng tìm hiểu về con trỏ cấu trúc trong c. Bạn sẽ biết cách sử dụng con trỏ để xử lý kiểu cấu trúc trong C sau bài học này.

Con trỏ cấu trúc trong c là gì

Trong bài Con trỏ trong C là gì chúng ta đã biết, con trỏ trong C là một biến được dùng để lưu trữ địa chỉ của dữ liệu trong bộ nhớ máy tính.

Thực thể tạo ra từ kiểu cấu trúc cũng là một loại dữ liệu trong C, và do đó, chúng ta cũng có thể sử dụng con trỏ để lưu trữ địa chỉ và qua đó thao tác với chúng. Chúng ta gọi con trỏ sử dụng trong cấu trúc là con trỏ cấu trúc trong c, và sử dụng nó để truy cập vào địa chỉ của các thực thể trong bộ nhớ, khai báo cũng như lấy giá trị các thành viên trong nó.

Xử lý cấu trúc thông qua con trỏ cấu trúc trong c

Trong bài Kiểu cấu trúc trong C là gì chúng ta đã học cách sử dụng trực tiếp cấu trúc cũng như thực thể được tạo ra từ chúng.

Tuy nhiên, bằng cách sử dụng con trỏ cấu trúc trong C, chúng ta có thể xử lý toàn bộ thực thể cũng như tất cả các thành viên trong nó, và đây có lẽ là cách thuận tiện nhất để xử lý một cấu trúc trong C.

Sau khi tạo ra một con trỏ cấu trúc lưu giữ địa chỉ của một thực thể tạo ra từ cấu trúc đó, để truy cập vào các thành viên của thực thể thì thay vì sử dụng dấu chấm như thông thường thì chúng ta sẽ sử dụng tới dấu mũi tên ->, với cú pháp sau đây:

instance_pointer -> member

Trong đó instance_pointer là con trỏ cấu trúc dùng để lưu địa chỉ của thực thể instance, và member là tên thành viên cần truy cập của thực thể đó.

Ví dụ cụ thể, sau khi tạo ra con trỏ chứa địa chỉ chỉ của một thực thể tạo ra từ cấu trúc, chúng ta có thể thực hiện các phép thay đổi giá trị thành viên, cũng như copy toàn bộ một thực thể sang một thực thể khác, thông qua các con trỏ chỉ tới chúng như sau:

#include <stdio.h>

//Khai báo cấu trúc
typedef struct person {
char *name;
char sex;
int age;
char *add;
char *job;
} person2;

int main(void) {
//Khai báo thực thể kiyoshi, và con trỏ tới thực thể này
person2 kiyoshi, *p1;
// Gán địa chỉ của thực thể vào con trỏ
p1 = &kiyoshi;

//Truy cập và gán giá trị vào thành viên trong con trỏ cấu trúc
p1->name = "Kiyoshi";
p1->sex = 'M';
p1->age = 20;
p1->add = "Tokyo";
p1->job = "BrSE";

printf("kiyoshi= %s %c %d %s %s\n",
kiyoshi.name, kiyoshi.sex, kiyoshi.age, kiyoshi.add, kiyoshi.job);

//Khai báo thực thể honda, và con trỏ tới thực thể này
person2 honda, *p2;

// Gán địa chỉ của thực thể vào con trỏ
p2 = &honda;

//Gán con trỏ của thực thể kiyoshi vào con trỏ của thực thể honda
//Qua đó tiến hành copy thực thể kiyoshi vào thực thể honda
*p2 = *p1;
printf("honda= %s %c %d %s %s\n",
honda.name, honda.sex, honda.age, honda.add, honda.job);

return 0;
}

Kết quả:

kiyoshi= Kiyoshi M 20 Tokyo BrSE
honda= Kiyoshi M 20 Tokyo BrSE

Sử dụng con trỏ cấu trúc trong hàm C

Một trong những ứng dụng thường được sử dụng nhất của con trỏ cấu trúc, đó chính là sử dụng nó như là đối số trong hàm, với mục đích truyền cấu trúc cho hàm trong C.

Để truyền cấu trúc cho hàm trong C, tất nhiên chúng ta cũng có thể sử dụng cách truyền trực tiếp cấu trúc đó vào hàm như Kiyoshi đã hướng dẫn trong bài Cấu trúc và hàm trong C.

Tuy nhiên sẽ là tiện lợi hơn nếu chúng ta truyền con trỏ cấu trúc vào hàm thay vì truyền trực tiếp cấu trúc đó. Có 2 lý do có thể kể đến như sau:

  1. Một là mất ít thời gian hơn để chỉ truyền giá trị con trỏ so với giá trị của toàn bộ cấu trúc. Điều này rất quan trọng đối với việc sử dụng hiệu quả bộ nhớ và thời gian thực thi
  2. Hai là dễ dàng thay đổi nội dung của cấu trúc từ bên ngoài hàm

Và sau đây là ví dụ cụ thể, thay vì truyền trực tiếp cấu trúc thì chúng ta truyền con trỏ cấu trúc vào hàm để gián tiếp xử lý cấu trúc đó như sau:

#include <stdio.h>

//Khai báo cấu trúc biểu diễn số phức
typedef struct {
double re; /* Phần thực */
double im; /* Phần ảo */
} complex_t;

//Tạo hàm tính tổng các cấu trúc thôg qua con trỏ cấu trúc
void addComplexPtr(complex_t *a, complex_t *b, complex_t *c)
{
(*c).re = (*a).re + (*b).re;
(*c).im = (*a).im + (*b).im;
}

//Tạo hàm nhận và in thực thể của cấu trúc
void printComplex(complex_t c)
{
printf("%f + %f i\n", c.re, c.im);
}

int main(void){
//Khởi tạo các thực thể của cấu trúc complex_t
complex_t x = {1.2, 3.4};
complex_t y = {5.6, 7.8};
complex_t z;

//Khởi tạo các con trỏ chứa địa chỉ các thực thể của cấu trúc
complex_t *p1 = &x;
complex_t *p2 = &y;
complex_t *p3 = &z;

addComplexPtr(p1, p2, p3);//addComplexPtr(&x, &y, &z);
printComplex(z);

return 0;
}

Kết quả:

6.800000 + 11.200000 i

Bạn có thể thấy thay vì truyền trực tiếp các thực thể của cấu trúc vào hàm để xử lý, chúng ta có thể dễ dàng xử lý chúng bằng cách gián tiếp, thông qua các con trỏ chỉ đến chúng.

Con trỏ cấu trúc là một ứng dụng quan trọng của con trỏ trong C. Đối với các bạn còn chưa nắm vững về con trỏ, có thể tham khảo thêm về con trỏ trong các bài viết sau:

Tổng kết

Trên đây Kiyoshi đã hướng dẫn các bạn về con trỏ cấu trúc trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.