Xin chào, và chào mừng trở lại. Điều cuối cùng tôi muốn nói về các
cấu trúc liên quan đến cách chúng liên quan đến các hàm, cách
bạn có thể chuyển các cấu trúc làm đối số cho một tham số và một hàm và
cách này cũng hiệu quả hơn.
Vì vậy, cấu trúc như là đối số cho các hàm.
Sau khi khai báo một cấu
trúc có tên là Family. Trong ví dụ này, chúng ta sẽ tạo một
họ có tên, làm cách nào để chúng ta chuyển cấu trúc này làm đối số cho một hàm.
Vì vậy, chúng tôi có cấu trúc này được gọi là Gia đình.
Chúng ta có một loạt các mảng ký tự
ở đây là tên, cha và mẹ và sau đó chúng ta có tuổi int.
Đó là định nghĩa cấu trúc của chúng tôi.
Chúng tôi biết đó là một cấu trúc bởi vì từ khóa struct ở đó, theo sau là tên
thẻ mà chúng tôi có dấu ngoặc nhọn, v.v.
Bây giờ làm thế nào để chúng ta thực sự truyền cấu trúc đó cho
một hàm được gọi là anh chị em?
Vâng, bạn sẽ làm điều đó giống như bạn khai báo cấu
trúc, bạn sẽ nói kiểu làm tên tham số.
Nó thực sự đơn giản. Vì vậy, trong trường hợp này, chúng ta có anh chị em Boolean.
Anh chị em đang trả lại một Boolean.
Và nó nhận hai tham số, hai tham số struct.
Bạn phải xác định kiểu struct đó là kiểu struct family.
Bây giờ trong c nâng cao hơn, bạn thực sự có thể
thực hiện một kiểu gõ trên cấu trúc này và đặt tên cho nó một cái gì đó khác và bạn
có thể rút ngắn tên ở đây, nhưng chúng ta chưa nói về kiểu gõ.
Điều đó có lẽ sẽ tốt hơn.
Nhưng đây thực sự là cách bạn cần làm. Bạn sẽ phải xác định toàn bộ kiểu, đó
là họ cấu trúc và sau đó là tên biến, giống như bất kỳ tham số nào khác.
Vì vậy, ở đây chúng tôi đang chuyển vào hai tham số, thành viên một và thành viên hai.
Cả hai đều thuộc loại cấu trúc gia đình.
Sau đó, bên trong chức năng của chúng tôi, nếu chúng tôi muốn truy cập thành viên, chúng tôi
truy cập thành viên như bình thường.
Thành viên một và thành viên hai, chúng không phải là con trỏ vì vậy chúng tôi không sử dụng dấu gạch ngang sau đó lớn hơn, chúng
tôi chỉ làm điều đó trên các con trỏ vì chúng tôi cần hủy tham chiếu chúng để xem chúng đang trỏ tới gì.
Bởi vì chúng không phải là con trỏ, chúng ta chỉ có thể thực hiện dấu chấm. Vì vậy, thành viên một chấm mẹ, thành viên hai chấm mẹ.
Thành viên một chấm mẹ và mẹ hai chấm
mẹ là mảng ký tự và mảng ký tự về cơ bản là con trỏ.
Vì vậy, chúng ta có thể chuyển chúng đến str so sánh. Str so sánh sẽ trả về bằng nếu chúng giống nhau, Vì vậy,
những gì chúng tôi đang làm ở đây là chúng tôi đang kiểm tra
thành viên một mẹ và thành viên hai mẹ giống nhau. Và nếu đúng như vậy, chúng ta sẽ trả về sự thật.
Bởi vì nếu cả hai có cùng tên và
đó thực sự là họ thì họ là anh em ruột.
Khá đơn giản.
Dễ dàng chuyển các đối số
cho các hàm miễn là khai báo hàm có kiểu struct đó trong đó.
Vì vậy, hàm này, một lần nữa, hai tham số mỗi tham số là một cấu
trúc của họ kiểu.
Điều gì xảy ra nếu chúng ta muốn có con trỏ đến cấu trúc làm đối số của hàm.
Và tôi đã đề cập trước đó, điều này tốt hơn nên làm vì chúng ta
đang thực hiện theo giá trị và c.
Khi bạn vượt qua giá trị, bạn sao chép.
Nếu bạn có một cấu trúc chứa nhiều dữ
liệu, nhiều cấu trúc lớn làm đối số,
bạn phải sao chép mọi thứ trong cấu
trúc đó vào hàm thực.
Vì vậy, có thể mất một thời gian
để sao chép những cấu trúc lớn đó.
Chà, nếu bạn có một con trỏ, tất cả những gì bạn phải làm là
sao chép địa chỉ sẽ nhanh hơn nhiều. Vì vậy, các con trỏ tới
cấu trúc được sử dụng như các tham số và chức năng để tránh tiêu tốn
bộ nhớ và thời gian cần thiết để sao chép tất cả các cấu trúc.
Bây giờ nếu bạn có một cấu trúc nhỏ, không có
vấn đề gì lớn, nhưng chắc chắn muốn sử dụng con trỏ và cấu trúc lớn.
Vậy trường hợp này bạn làm sao, bạn vẫn ghi rõ tên các loại kết cấu,
bạn cứ đặt dấu hoa thị
trước, rất đơn giản. Và nếu bạn không muốn
bất kỳ dữ liệu nào bên trong cấu trúc thay đổi, bạn có thể sử dụng hằng trước kiểu cấu trúc.
Nếu bạn không muốn địa chỉ thay đổi, bạn sẽ đặt hằng số sau con trỏ họ struct.
Nhưng ở đây, chúng tôi đang làm điều tương tự. Nhưng bây giờ chúng ta sẽ truy cập
nó theo cách khác vì bây giờ nó là một con trỏ, chúng ta có thể sử dụng
dấu gạch ngang lớn hơn, biểu tượng mới đó để truy cập thay vì sử dụng dấu chấm.
Chúng ta không cần phải sử dụng dấu chấm ở đây. Bởi vì hãy nhớ
rằng, con trỏ bạn phải hủy tham chiếu trước vì vậy bạn phải đặt nó trong dấu ngoặc đơn,
cú pháp nhiều hơn để hủy tham chiếu con trỏ sau đó bạn phải đặt dấu chấm bên ngoài dấu ngoặc đơn
vì nó có mức độ ưu tiên cao hơn, nhiều dễ sử dụng dấu gạch ngang hơn lớn hơn.
Dấu gạch ngang và lớn hơn mẹ, dấu gạch
ngang và lớn hơn mẹ, chúng đều là con trỏ, chúng có thể được chuyển trong phép so sánh str.
Nếu chúng giống nhau, hãy trả về true. Nếu không, trả về false, khá đơn giản.
Bạn cũng có thể sử dụng công cụ sửa đổi const như tôi đã đề cập
nếu bạn không muốn cho phép bất kỳ sửa đổi nào đối với các thành viên của cấu trúc.
Cấu trúc đang trỏ đến cái gì thì bạn đặt const trước con trỏ.
Bạn cũng có thể đặt const trước cả gia đình.
Trong trường hợp này, gia đình có một kiểu chữ.
Vì vậy, ở đây
nó thực sự sẽ là con trỏ construct family hoặc struct family const pointer.
Và sau đó truy cập lại theo cách tương tự, bạn không sửa đổi bất cứ điều gì. Vì vậy, bạn tốt để đi.
Trình biên dịch sẽ không phàn nàn.
Bạn cũng có thể sử dụng công cụ sửa đổi hằng số nếu bạn không muốn cho phép bất kỳ
sửa đổi nào đối với chính địa chỉ đó.
Bất kỳ nỗ lực nào để thay đổi các cấu trúc này sẽ gây ra thông báo lỗi trong quá trình biên dịch.
Vì vậy, ở đây bạn sẽ
nói ngôi sao gia đình và bạn đặt hằng số sau ngôi sao.
Và điều này đang nói là bạn không thể
thay đổi giá trị của p-member, giá trị của con trỏ, là một địa chỉ.
Nhưng một lần nữa, điều này không hữu ích lắm vì
khi bạn chuyển giá trị, bạn thực sự đang chuyển một bản sao địa chỉ.
Vì vậy, điều này là thừa, bạn không cần phải làm điều này, nhưng bạn có thể.
Và ở đây, một lần nữa, bạn muốn có thể thay đổi địa chỉ của thành viên p là gì.
Và trong trường hợp này, bạn chỉ cần truy cập vào dữ liệu để xem chúng có bằng nhau hay không.
Toán tử điều hướng trong mỗi định nghĩa tham số bây
giờ nằm trước từ khóa hằng.
Dấu hoa thị đó, nó không ở phía trước tên thông số.
Bạn không thể sửa đổi địa chỉ được lưu trữ trong con trỏ vì nó nằm sau dấu hoa thị.
Nếu nó đứng trước loại tên tham số, thì bạn
muốn có thể sửa đổi thực tế những gì nó trỏ tới.
Nếu chúng ta có toán tử điều hướng đó ở phía trước tên tham số, thì sẽ là gì
trong hằng số trước nó, điều đó có nghĩa
là bạn muốn có thể sửa đổi những gì nó trỏ tới. Đây chỉ là nói địa chỉ.
Vì vậy, bạn không thể sửa đổi địa chỉ được lưu trữ trong các con trỏ.
Đó là các con trỏ được bảo vệ ở đây không phải là cấu trúc
mà chúng trỏ tới, giống như hằng số và các tham số con trỏ khác, không có sự khác biệt với cấu trúc.
Nếu bạn muốn trả về một cấu trúc từ một hàm là một
con trỏ, thì nguyên mẫu hàm phải chỉ ra giá trị trả về này theo cách
thông thường trong khai báo.
Vì vậy, ở đây bạn phải nói rằng đã hẹn hò với
con trỏ thú vị của tôi hay
không con trỏ, điều đó không quan trọng. Đây là một nguyên mẫu cho một hàm không có đối số trả về một
cấu trúc kiểu ngày tháng, rất dễ dàng để trả về một cấu trúc từ một hàm. Và giá trị của điều này là gì.
Bây giờ chúng ta có thể trả về
nhiều hơn một phần tử hoặc một mục dữ liệu từ một hàm.
Nếu bạn đang trả về một cấu trúc, bạn có thể trả về 10 giá trị, 10 mục dữ liệu khác nhau.
Điều đó thật tuyệt làm sao. Cấu trúc cho phép bạn trả về nhiều hơn một từ một hàm.
Rất, rất có giá trị.
Vì vậy, sẽ thuận tiện hơn khi trả về một con trỏ đến một cấu trúc thay vì chỉ cấu trúc.
Khi bạn trả về một con trỏ đến cấu trúc, nó được tạo trên heap vì tất
cả các con trỏ được tạo trên heap.
Điều này có nghĩa là nó sẽ tồn tại lâu hơn một chút.
Và điều này có nghĩa là bạn có thể xóa nó và quản lý nó vào những thời điểm tùy ý.
Vì vậy, trong ví dụ này, chúng tôi đang tạo một quỹ có tên cấu trúc.
Nó chứa một mảng ký tự có
tên là ngân hàng, chứa một ký tự kép, một ký tự khác
có tên được lưu với độ dài cụ thể. Chỉ giả sử độ dài vui nhộn là bằng 50.
Và sau đó nó có một cái được lưu kép.
Chúng ta có một hàm gọi là sum lấy cấu trúc đó làm tham số.
Và tất cả những gì chúng tôi đang làm bên trong đó là chúng tôi
đang trả lại một - quỹ ngân hàng từ cấu trúc đầu tiên cộng với quỹ tiết kiệm, và điều
đó sẽ trả lại số tiền mà họ có trong ngân hàng của họ.
Trong ví dụ này, tổng chỉ là một nhân đôi.
Chúng tôi không trả lại một con trỏ. Chúng tôi chỉ lấy một con trỏ làm tham số.
Và vì vậy trong chức năng chính của chúng tôi, chúng tôi đang tạo một biến
cấu trúc được gọi là stan của loại quỹ cấu trúc.
Chúng tôi đang khởi tạo nó với một số giá trị, và sau đó chúng tôi
đang in ra tổng số gọi sum. Và chúng tôi chỉ truyền cấu trúc này giống như chúng tôi truyền bất kỳ biến nào.
Chúng tôi không cần phải hủy tham chiếu nó không phải là một con trỏ. Chúng tôi không phải thực sự làm bất cứ điều gì đặc biệt.
Chúng tôi chỉ đảm bảo rằng trong phần khai báo hàm, chúng tôi có kiểu struct đó ở đó,
nhưng mọi thứ khác trông bình thường.
Một vài lời nhắc nhở.
Tôi đã đề cập trước đó rằng bạn nên luôn sử dụng con trỏ khi chuyển cấu trúc cho một hàm.
Tại sao? Vì hãy nhớ rằng, các phiên bản cũ
hơn của c
không cho phép truyền các cấu trúc, nhưng chúng cho phép con trỏ.
Vì vậy, bạn có thể tránh bất kỳ loại tương thích ngược nào.
Nếu bạn đang sử dụng phiên bản c cũ hơn, chương trình của bạn sẽ hoạt động.
Vì vậy, chỉ cần chuyển vào địa chỉ duy
nhất đó cũng hiệu quả hơn vì sao chép thời gian.
Nhưng nếu bạn làm điều này, nếu bạn truyền một tham số là một con trỏ đến một
cấu trúc bên trong một hàm, thì nó sẽ có ít khả năng bảo vệ dữ liệu của bạn hơn.
Vì vậy, một số hoạt động trong hàm được gọi có thể vô tình ảnh hưởng đến dữ
liệu trong cấu trúc ban đầu.
Và đây là nơi bạn muốn sử dụng định tính const.
Và bạn sẽ sử dụng const trước kiểu
thực, không phải sau dấu hoa thị và trước
tên tham số, trước kiểu.
Ưu điểm của việc truyền các cấu trúc là các đối số,
hàm hoạt động với các bản sao của dữ liệu gốc.
Nó an toàn hơn so với làm việc với dữ liệu gốc.
Vì vậy, đó thực sự là lần duy nhất bạn muốn chuyển một cấu trúc dưới dạng một đối số không phải là một con trỏ.
Và phong cách lập trình có xu hướng rõ ràng hơn một chút.
Nhược điểm chính của việc truyền cấu trúc làm đối số trái ngược với việc truyền con
trỏ có cấu trúc làm đối số là các
triển khai cũ hơn có thể không xử lý được mã,
gây lãng phí thời gian và không gian
và đặc biệt lãng phí khi bạn có cấu trúc lớn, chúng ta phải
sao chép nhiều thành viên. Vì vậy, hãy ghi nhớ điều này.
Đối với hầu hết các phần, bạn muốn chuyển con
trỏ đến cấu trúc, hiệu quả hơn nhiều và tiết kiệm thời gian.
Các lập trình viên sử dụng con trỏ cấu trúc làm đối số hàm vì lý do hiệu quả và
họ sử dụng hằng số khi cần thiết. Và đây là sự kết hợp mà bạn muốn làm.
Nếu bạn lo lắng về việc bảo vệ, chỉ cần sử dụng con
trỏ hàm cho hiệu quả và sau đó
sử dụng const const để không có gì bị vướng vào bên
trong hàm, giống như con trỏ thực sự bình thường,
nhưng với con trỏ, điều đó thậm chí còn quan trọng hơn với hiệu quả bởi
vì của các cấu trúc lớn.
Truyền cấu trúc theo giá trị thường được thực hiện nhất đối với cấu trúc nhỏ và
đó là loại quy tắc bạn muốn nghĩ đến.
Được để vượt qua một cấu trúc không phải là một con trỏ miễn là nó nhỏ.
Một lần nữa, một số khái niệm quan trọng liên quan
đến cấu trúc và chuyển con trỏ làm tham số,
đối số và con trỏ trả về. Bây giờ, chúng ta thực sự có thể bắt đầu thực
hiện một số điều này. Chúng tôi cung cấp nhiều ví dụ. Chúng tôi hiểu các khái niệm. Chúng tôi hiểu cú pháp.
Bây giờ tôi muốn giới thiệu cho bạn một vài thử thách mà bạn thực sự làm được điều này, bạn đã
ghi nhớ cú pháp mà bây giờ nếu bạn muốn tạo một cấu trúc trong chương trình, bạn sẽ biết cách
làm điều đó giống như bàn tay của bạn.
Vì vậy, chúng tôi sẽ có một vài thử thách trong vài bài giảng tiếp theo
của chúng tôi để giúp bạn làm quen với tất cả những điều mà chúng ta đã nói về cấu trúc liên quan.
Cảm ơn bạn.