Xin chào, và chào mừng trở lại.
Tôi muốn cung cấp một giải pháp để thử thách trước trong bài giảng này.
Một minh chứng về cách bạn có thể có con trỏ như các phần tử bên trong
cấu trúc và cũng có thể truyền xung quanh con trỏ hai
hàm là cấu trúc.
Vì vậy, hãy đưa ra mã khối, tạo một dự án mới.
Đây sẽ là một bảng điều khiển ứng dụng, và chúng tôi sẽ đặt
tên cho ví dụ con trỏ cấu trúc này.
Và vì vậy nếu bạn nhớ cho yêu cầu đối
với điều này, về cơ bản đây chỉ là một loại sản phẩm cấu trúc đã lưu trữ tên mặt hàng,
số lượng, giá cả và số tiền.
Và tên mặt hàng sẽ trở thành một con trỏ ký tự.
Bạn sẽ có một về cơ bản chỉ nhân
số lượng với giá.
Và sau đó chúng tôi có hai chức năng điều đó sẽ coi như các tham
số con trỏ đến một cấu trúc.
Vì vậy, điều đầu tiên chúng tôi việc cần làm là chúng
ta sẽ tạo ra cấu trúc của chúng ta.
Và tôi đã đề cập đến vấn đề này trước đó, nhưng thật
tốt khi tạo cấu trúc trên toàn cầu bởi vì nếu bạn muốn sử dụng nó trong nhiều chức năng.
Tạo cấu trúc đang thực sự xác định nó.
Bạn không cấp phát bất kỳ bộ nhớ nào.
Vì vậy, không có hại đưa nó ra toàn cầu.
Và họ thường vào trong dù sao thì tệp tiêu đề.
Vì vậy, để tạo ra một cấu trúc, chúng tôi chỉ nói cấu trúc.
Chúng tôi sẽ gọi mặt hàng này và chúng ta sẽ có bốn yếu tố.
Chúng ta sẽ có một nhân vật con trỏ, mà chúng ta
sẽ gọi tên mục.
Chúng tôi sẽ có một số lượng.
Chúng ta sẽ có một chiếc phao để biết giá, và chúng ta sẽ có
một sự thả nổi cho số lượng.
Và đó là cách chúng tôi có thể xác định cấu trúc của chúng tôi, khá cơ bản.
Bây giờ bên trong chức năng chính của chúng tôi, chúng tôi muốn tạo một biến cho kiểu cấu trúc và
cả một con trỏ.
Vì vậy, điều đầu tiên chúng tôi muốn làm là chúng ta chỉ muốn nói struct item với tên
của cấu trúc và sau đó chúng tôi sẽ chỉ gọi mặt hàng này.
Và đây chỉ là tạo một con trỏ lẻ.
Điều này sẽ phân bổ bộ nhớ cho bốn biến và phần tử
bên trong cấu trúc.
Và vì vậy chúng tôi muốn tạo con trỏ của chúng tôi bây giờ, và chúng ta chỉ có thể nói struct item.
Chúng ta sẽ nói mục p bởi vì chúng tôi thường đặt tên con
trỏ của chúng tôi với tiền tố p.
Vì vậy, chúng tôi nói dấu hoa thị, và chúng tôi nói mục p.
Và sau đó trong dòng tiếp theo, chúng
tôi chỉ muốn gán cho mục con trỏ của chúng tôi, mục của chúng tôi.
Vì vậy, chúng ta cần sử dụng địa chỉ của và chúng tôi nói mục.
Và ở đây chúng ta có bộ nhớ được phân bổ cho các phần tử trong cấu trúc của chúng tôi cho con
trỏ của chúng tôi.
Chúng tôi không có bất kỳ ký ức nào được phân bổ cho con trỏ ký
tự của chúng tôi, đó là tên mục của chúng tôi, vì vậy đó sẽ là bước tiếp theo.
Bây giờ bạn có thể hỏi tại sao chúng tôi cần để tạo cấu trúc mục.
Chúng tôi không thực sự.
Chúng tôi chỉ có thể tạo con trỏ và con trỏ sẽ chỉ tạo bộ nhớ cho
con trỏ mục struct đó.
Nó sẽ cấp phát bộ nhớ cho int và
float, nhưng chúng ta vẫn phải thực hiện phân bổ tên mục.
Tôi chỉ thích làm điều này bởi vì đây thường là thực hành tốt.
Điển hình là những gì bạn sẽ làm với cấu trúc mục đầu tiên là bạn sẽ khởi
tạo nó, và vì vậy bạn sẽ có một số khởi tạo.
Nhưng chúng ta không cần phải làm điều đó.
Vì vậy, điều đầu tiên chúng tôi muốn làm là cấp phát bộ nhớ cho tên mặt hàng của chúng ta.
Vì vậy, về cơ bản chúng ta có thể sử dụng toán tử đặc biệt để truy cập các phần tử nếu
đó là một con trỏ.
Hãy nhớ rằng, đối với các cấu trúc là con trỏ, bạn có dấu gạch ngang sau đó lớn hơn
ký hiệu mà bạn có thể sử dụng để truy cập các phần tử.
Nếu không, bạn phải hủy tham chiếu con trỏ để truy cập các phần tử.
Chúng tôi có thể làm một cái gì đó như cái này bên trong dấu ngoặc đơn.
Chúng tôi có thể hủy tham chiếu con trỏ, vì
vậy chúng tôi sẽ phải làm một cái gì đó như mục dấu sao p và sau đó sử dụng dấu chấm để truy cập các phần tử.
Điều này hoàn toàn hợp lệ để làm một cái gì đó như thế này.
Nhưng nó là một loại cú pháp bổ sung mà bạn không thực sự cần.
Vì vậy, c có cú pháp đặc biệt bạn có thể sử dụng bất cứ khi nào cấu trúc của bạn
là một con trỏ nếu bạn muốn truy cập các phần tử.
Về cơ bản bạn chỉ có thể nói tên của con trỏ là mục p và sau đó sử dụng
dấu gạch ngang sau đó lớn hơn.
Và trong trường hợp này, chúng tôi muốn cấp phát bộ nhớ cho tên mục.
Vì vậy, chúng tôi sẽ chỉ định nó là gì được trả về từ hàm malloc.
Hãy nhớ rằng, hàm malloc trả về một con trỏ void.
Vì vậy, chúng tôi phải truyền nó đến một ngôi sao nhân vật.
Nhưng chúng ta có thể gọi malloc, chỉ nói malloc và sau đó là kích thước của
byte mà chúng ta muốn tạo.
Trong trường hợp này, chúng tôi sẽ chỉ nói 30, và chúng tôi sẽ nhân nó với kích thước của char,
đề phòng trường hợp char là kích thước khác nhau trên các máy tính khác nhau.
Và điều này sẽ phân bổ bộ nhớ cho tên mặt hàng của chúng tôi.
Chúng ta cần làm điều này vì tên mặt hàng là một con trỏ bên trong cấu trúc.
Nó không có bộ nhớ được phân bổ cho nó khi
bạn gán nó cho một cấu trúc khác.
Vì vậy, chúng ta phải làm điều này.
Bây giờ điều đầu tiên bạn muốn để làm
sau khi bạn đã cấp phát bộ nhớ là kiểm tra malloc.
vì vậy chúng tôi muốn kiểm tra null ở đây.
Chúng ta sẽ chỉ nói mục if p, nếu nó không có nghĩa là nó không có giá trị.
Nếu không, bạn sẽ nói nếu không, bạn có thể chỉ cần nói quay lại hoặc thoát có lẽ sẽ tốt hơn, thoát khỏi chương
trình nếu chúng tôi không thể cấp phát bộ nhớ và bạn có thể chuyển
nó thành bộ nhớ âm.
Nếu không, chúng tôi muốn đọc trong một mục, vì vậy chúng tôi muốn tạo một hàm.
Chức năng mà chúng ta đang sử dụng để tạo được gọi là mục đã đọc.
Hãy thiết lập một khai báo hàm lên đây bên trên cấu trúc.
Nó chỉ được đọc trong dữ liệu vào cấu trúc mà chúng tôi đã chuyển cho nó.
Nó sẽ không trả về bất kỳ dữ liệu nào.
Vì vậy, chúng ta chỉ có thể nói mục đã đọc và nó cần một cấu trúc, và đó sẽ là một
con trỏ.
Vì vậy, nó là một mục cấu trúc, dấu hoa thị I.
Bây giờ chúng ta có thể biến điều này thành một hằng số vì vậy loại giá trị thay
đổi, nhưng chúng tôi đang thay đổi các giá trị.
Nhưng chúng ta có thể nói cấu trúc không đổi, các giá trị sẽ không thể thay đổi đối
với con trỏ mà nó đang trỏ tới.
Nếu chúng ta đã làm hằng số sau dấu hoa thị cho biết địa chỉ không thể thay đổi hoặc
đúng trước dấu hoa thị một cái gì đó tương tự
sau tên.
Điều đó có nghĩa là địa chỉ không thể thay đổi, nhưng
điều đó là thừa vì chúng ta đang chuyển qua giá trị sao chép.
Chúng tôi có mục đã đọc của chúng tôi.
Và trong khi tôi ở đây, tôi có thể cũng như làm mục in của tôi.
Đó chỉ là chức năng khai báo, nguyên mẫu hàm.
Đây, nó sẽ rất tương tự, cũng lấy một con trỏ.
Có thể có một không gian nếu bạn muốn sau dấu hoa thị hay không?
Bây giờ chúng ta có thể xác định giá trị đọc của chúng ta mục bên dưới phương pháp chính của chúng tôi.
Và điều này sẽ được đọc trong các giá trị của mặt hàng và
sau đó tính tổng số tiền.
Vì vậy, chúng ta có thể nói void read mục, có con trỏ của chúng tôi.
Và bên trong đây, chúng tôi chỉ muốn để sử dụng một số scanfs thực sự.
Chúng tôi sẽ in ra một số tin nhắn để yêu cầu người dùng nhập thông tin.
Vì vậy, chúng tôi sẽ nói nhập tên sản phẩm, và sau đó chúng ta sẽ đọc nó
trong.
Vì vậy, chúng ta sẽ nói scanf, và chúng tôi có một con trỏ đến một cấu trúc, vì vậy chúng tôi có thể
truy cập nó sử dụng dấu gạch ngang sau đó lớn hơn.
Chúng tôi muốn đọc scanf, tên sản phẩm là một bộ đệm ký tự.
Vì vậy, chúng tôi muốn nói phần trăm s và thì chúng ta sẽ nói là I, chúng ta sẽ lưu
trữ nó trong tên item.
Và chúng tôi có thể quay lại và sử dụng intellisense chỉ cần chuyển đến tên mục.
Chúng tôi không cần phải sử dụng địa chỉ của toán tử vì nó
là một con trỏ ký tự.
Sau đó chúng tôi muốn in ra và lấy giá, có
thể muốn thêm một số nguồn cấp dữ liệu dòng vào đây, hãy nhập giá.
Chúng tôi sẽ lưu trữ đó trong cấu trúc.
Vì vậy, một lần nữa, giá là một sự thả nổi.
Vì vậy, tôi sẽ nói phần trăm f, nhưng chúng tôi cũng sẽ truy cập nó vì nó là một con trỏ, chúng tôi vẫn
muốn sử dụng dấu gạch ngang sau đó lớn hơn.
Ngoại trừ lần này, chúng tôi sẽ nói giá, và chúng tôi cần lấy địa chỉ của nó, vì vậy chúng tôi sẽ
đặt một dấu và ở phía trước nó vì giá không
phải là một con trỏ.
Và sau đó chúng tôi sẽ làm điều tương tự đối với số lượng.
Vì vậy, đại lượng là một số nguyên.
Vì vậy, chúng ta có thể nói phần trăm d, chúng ta vẫn cần để lấy địa chỉ của
nó, nhưng chúng tôi muốn lưu trữ nó trong một phần tử khác, chúng tôi muốn lưu trữ nó với số lượng.
Bây giờ chúng tôi đã lưu trữ hoặc yêu cầu người dùng nhập ba mục
thông tin, bây giờ chúng tôi có thể thực sự tính toán số lượng, lưu trữ một cái gì
đó trong số lượng.
Số tiền chỉ là số lượng nhân với giá.
Vì vậy, chúng tôi vẫn muốn truy cập vào cấu trúc sử dụng cú pháp của chúng tôi,
chúng tôi muốn ép kiểu, chúng tôi muốn ký số lượng nhân với giá.
Và đó là chức năng mục đã đọc.
Sử dụng một con trỏ cấu trúc.
Và vì vậy khi chúng tôi sửa đổi con trỏ này bên trong mục đã đọc, nó
sẽ được sửa đổi bên ngoài chức năng.
Vì vậy, bất kỳ cấu trúc nào chúng tôi chuyển vào hàm này, nó sẽ
được sửa đổi.
Nó sẽ lưu trữ tất cả mặt hàng, tên mặt hàng, giá cả
và số lượng và số lượng.
Vì vậy, điều đó đọc trong dữ liệu.
Tại thời điểm này, bạn muốn thử nghiệm và bạn có thể muốn biên
dịch và thử nghiệm trước điều này.
Nhưng bây giờ chúng ta có thể gọi là mục đã đọc phương thức trong chính của chúng tôi và chuyển nó vào
cấu trúc của chúng tôi mà chúng tôi đã tạo.
Vì vậy, chúng ta có thể nói mục đã đọc, và chúng ta chỉ có thể nói mục p.
Chúng tôi không cần phải vượt qua địa chỉ bởi vì nó là một con trỏ, vì vậy
chúng tôi chỉ chuyển vào cấu trúc của chúng tôi.
Và sau đó, điều tiếp theo chúng tôi có thể làm là chúng tôi có thể in nó ra.
Và điều này sẽ cho bạn thấy là rằng dữ liệu đã được lưu, mục p đang
được sửa đổi bên trong hàm và nó được lưu bên ngoài chức năng, chức năng chính
thực sự đã lưu các giá trị đó.
Vì vậy, chúng ta có thể nói mục in chuyển trong con trỏ một lần nữa, và sau đó chúng ta có thể xác định
chức năng mục in.
Mục in là khá cơ bản.
Nó không trả lại bất cứ điều gì, vì vậy chúng tôi nói void
và chúng tôi nói mục in có một con trỏ.
Vì vậy, chúng tôi chỉ nói cấu trúc mục sao Tôi, bất cứ điều gì bạn muốn đặt tên cho nó.
Và sau đó chúng tôi chỉ in ra dữ liệu cho cấu trúc đã được chuyển vào.
Vì vậy, chúng tôi sẽ làm một cái gì đó như printf name% s, I item name, I price, I
number and I số lượng và sau đó chúng tôi định dạng dữ liệu.
Điều cuối cùng chúng ta có là gì để
làm trong phần chính sau khi chúng tôi in ra dữ liệu, chức năng miễn phí thực sự quan trọng.
Chúng tôi phải gọi miễn phí vì chúng tôi muốn giải phóng bộ nhớ mà chúng tôi
đã cấp cho tên mục.
Vì vậy, chúng ta chỉ có thể nói mục p miễn phí và sau đó truy cập vào tên mục.
Chúng tôi không muốn giải phóng toàn bộ cấu
trúc bởi vì toàn bộ cấu trúc sẽ bị xóa trên ngăn xếp khi hàm trả về.
Chúng tôi chỉ muốn giải phóng những gì chúng tôi thiếu sót.
Chúng tôi chỉ sai cho mục tên để chúng tôi giải phóng điều đó, và sau đó chúng
tôi quay trở lại từ chính.
Vì vậy, hãy tiếp tục và cố gắng xây dựng điều này.
Và chúng tôi có một lỗi.
Hãy xem nó nói cấu trúc mục ngôi sao.
Vì vậy, chúng tôi đã có một sai lầm ở đâu các chức năng đã được xác định ở
trên cấu trúc.
Nhưng chức năng lấy một tham số như một kiểu cấu trúc.
Vì vậy, chúng ta phải có cấu trúc được định nghĩa ở trên nơi chúng tôi đang sử dụng nó.
Vì vậy, tôi di chuyển các chức năng xuống dòng 12 và 13.
Bây giờ chúng tôi có thể biên dịch.
Hãy tiếp tục và chạy cái này.
Và hãy xem những gì chúng tôi nhận được ở đây.
Chúng tôi có một lỗi nữa.
Bạn phải chắc chắn rằng bạn kiểm tra mục p xem có giá trị nào không.
Nếu bạn chỉ nói nếu p mục cho sự thật, nó sẽ luôn luôn đúng.
Vì vậy, bạn có thể kiểm tra để nói nó không đúng với biểu tượng
not có nghĩa là nó không rỗng hoặc bạn có thể kiểm tra xem nó có trống không.
Vì vậy, tôi chỉ thêm null ở đó.
Vì vậy, bây giờ chúng tôi chạy nó, chúng tôi nên tốt để đi.
Chúng ta có thể nhập tên sản phẩm.
Chúng tôi sẽ nói nối tiếp và chúng tôi sẽ nói giá là 1. 99.
Và chúng tôi sẽ nói rằng chúng tôi có năm trong số đó.
Và bây giờ chúng tôi in nó ra, và chúng tôi nói 99 đô la nối tiếp.
5, tổng số tiền là 9. 95.
Giá cả mặc dù tôi không thích giá cả được in ra như thế nào.
Vì vậy, chúng ta hãy khắc phục điều đó.
Trong mục in của chúng tôi, chúng tôi chỉ có thể nói cho giá dor 2 f nổi, bây giờ
chúng ta sẽ trông tốt hơn một chút và chúng ta chạy nó.
Chúng tôi sẽ nhận được một ít một chút định dạng tốt hơn.
Bốn trong số họ và bây giờ nó có vẻ tốt hơn một
chút, và mọi thứ vẫn tốt.
Vì vậy, một lần nữa, chương trình cơ bản sử dụng cấu trúc và con trỏ.
Chúng tôi đã tạo cấu trúc ở trên cùng.
Chúng tôi có một thành viên chứa một con trỏ, rất hiệu quả
để làm điều đó vì chúng tôi có thể chỉ sao chép và địa chỉ
thay vì mảng ký tự.
Chúng tôi có hai khai báo func của chúng tôi, đọc mục in
mục nhận con trỏ hủy.
Và sau đó chúng tôi tạo con trỏ và gán nó vào một cấu trúc thông thường
bên trong main của chúng ta.
Chúng tôi cấp phát bộ nhớ trên dòng 22.
Chúng tôi đảm bảo rằng bộ nhớ là phân bổ thành công nếu nó không phải là
chúng tôi thoát khỏi chương trình.
Và sau đó chúng tôi gọi hai chúng tôi các hàm đưa con
trỏ đến cấu trúc, chuyển chúng vào.
Và cuối cùng nhưng không kém phần quan trọng, chúng tôi giải phóng bộ nhớ và sau đó chúng tôi
thoát khỏi chương trình.
Và các chức năng là khá đơn giản.
Bạn lấy con trỏ đó.
Bạn truy cập con trỏ bằng cách sử dụng dấu gạch ngang sau đó lớn hơn.
Và bạn nhận được địa chỉ của nó dành cho các bản scanfs không
có con trỏ làm phần tử.
Và về cơ bản đó là nó.
Tôi sẽ lưu chương trình này, bạn hãy nhìn vào nó.
Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi. Cảm ơn bạn.