Xin chào, và chào mừng trở lại. Bây giờ chúng ta đã hiểu con trỏ chi tiết
hơn một chút, tôi muốn nói về con trỏ ký tự, chủ
yếu là cách bạn có thể sử dụng con trỏ ký tự để biểu diễn chuỗi.
Chuỗi là mảng ký tự, nhiều ký tự, từ.
Vì vậy, bây giờ chúng ta biết cách mảng liên quan đến con trỏ trong khái niệm số học con trỏ.
Khái niệm rất, rất hữu ích.
Những khái niệm này có thể rất hữu ích khi áp dụng cho
các chuỗi ký tự bởi vì bây giờ chúng ta có thể dễ dàng duyệt một chuỗi ký tự theo từng ký tự.
Một trong những ứng dụng phổ biến nhất của việc sử dụng con trỏ tới một
mảng là con trỏ tới một chuỗi ký tự.
Những lý do này là một trong những lý do thuận tiện và hiệu quả.
Vì vậy, việc sử dụng một biến kiểu con trỏ tới char để tham chiếu
một chuỗi mang lại cho bạn rất nhiều sự linh hoạt.
Vì vậy, bạn sẽ cố gắng sử dụng
con trỏ ký tự nhiều nhất có thể trên
các mảng ký tự, cụ thể là sử dụng con trỏ ký tự để truyền dữ liệu cho một hàm.
Tất cả những thứ tốt đẹp như vậy.
Vì vậy, chúng ta hãy xem xét một ví dụ sử dụng một mảng để sao chép một chuỗi.
Trong ví dụ này, tham số mảng của chúng ta sẽ là một mảng ký tự.
Bạn sẽ thấy điều đó ngay trong phần khai báo hàm.
Tôi muốn so sánh điều này với một hàm sử dụng con trỏ
ký tự và cho bạn thấy cách hàm con trỏ ký tự hiệu quả hơn nhiều.
Vì vậy, trong ví dụ này, chúng ta có
hai hàm, một hàm nhận mảng và một
hàm nhận con trỏ.
Trong chuỗi sao chép hàm đầu tiên, chúng ta
có thể đi qua toàn bộ mảng bằng cách sử dụng vòng lặp for I bằng 0 từ sub I
và chúng ta làm theo cách này cho đến khi chúng ta thấy chuỗi ký tự null và
sau đó chúng ta tăng biến điều khiển vòng lặp của mình.
Và sau đó tất cả những gì bạn phải làm là nói 2 phụ I bằng với phụ I. Chúng tôi đang thực hiện một nhiệm vụ
trực tiếp ở đó.
Và cuối cùng sau khi chúng ta đã đi hết cho đến khi chúng ta thấy
ký tự null, chúng ta thêm một ký tự null vào cuối mảng
của chúng ta, khá cơ bản. Bây giờ chúng ta hãy xem cách chúng ta làm điều đó khi chúng ta sử dụng con trỏ.
Đầu tiên, chúng ta khai báo con trỏ là khai báo hàm trong chuỗi bản
sao bằng cách chỉ nói char star để char bắt đầu từ.
Trong vòng lặp for của chúng tôi, chúng tôi thực sự không phải khai báo
bất kỳ biến nào bởi vì chúng tôi có các con trỏ và
chúng tôi chỉ muốn lặp lại cho đến khi từ chạm tới dấu chấm dứt null.
Và sau đó chúng ta có thể tăng cả con trỏ từ và con trỏ đến.
Bởi vì ở đây chúng ta đang làm số học điểm.
Chúng tôi chỉ thêm một vào con trỏ đang tăng địa chỉ của nó lên một, sẽ nhận
được ký tự tiếp theo.
Và dòng lặp for tiếp theo, chúng ta chỉ bỏ
tham chiếu cả đến và từ vì chúng ta
muốn gán giá trị thực mà con trỏ đang trỏ đến,
ký tự thực tế cho con trỏ tới.
Và sau đó ở cuối, chúng ta thêm ký
tự null vào bất kỳ nơi nào mà con trỏ trỏ
đến sẽ nằm ở cuối địa chỉ cuối cùng của chuỗi cho from nhưng bây
giờ trỏ vào địa chỉ tới.
Nó trông không quá tệ. Ý tôi là bạn có vòng lặp for.
Về cơ bản, bạn có cùng một lượng dòng mã.
Nhưng bạn thấy sự khác biệt về cú pháp.
Bạn không sử dụng đăng ký và bạn sử dụng con trỏ, hãy sử dụng dấu hoa thị.
Một lần nữa, thực sự là một vấn đề của sự tiện lợi về mặt ký hiệu.
Bạn không thấy một lợi thế lớn ở đây.
Nhưng bạn thực sự có thể tối ưu hóa điều này nhiều hơn để
thậm chí nhận được ít mã hơn khi bạn sử dụng các con trỏ.
Vì vậy, nếu bạn có một mảng char làm
con trỏ, nếu bạn có một mảng ký tự được gọi là văn bản, bạn có thể xác định
tương tự một con trỏ tới nó và sử dụng các phần tử trong văn bản.
Vì vậy, ở đây chúng ta có thể nói con trỏ
văn bản dấu sao, đó là cách bạn xác định một con trỏ ký tự.
Nếu con trỏ văn bản được đặt trỏ đến phần đầu của mảng ký tự được
gọi là văn bản, thì bạn có thể tăng
nó lên từng cái bằng cách sử dụng các toán tử triển khai và giảm dần trước và sau này.
Vì vậy, ở trên, con trỏ văn bản cộng cộng này sẽ đặt con trỏ văn bản trỏ
đến ký tự tiếp theo trong văn bản, đó là văn bản phụ 1.
Vì vậy, nếu chúng ta muốn xem tia tiếp theo giống như đối với số nguyên, tất
cả những gì chúng ta phải làm là thêm 1 2 và chúng ta có thể nhận được ký tự tiếp theo.
Nó hữu ích hơn nhiều mặc dù trong mảng
ký tự vì bạn có thể dễ dàng thao tác với từng ký tự một.
Nếu bạn thực hiện con trỏ văn bản trừ đi, là toán tử giảm dần, sẽ
đặt con trỏ thành ký tự trước đó trong văn bản, giả
sử rằng con trỏ văn bản không trỏ đến đầu văn bản.
Bởi vì nếu có, bạn sẽ có những lỗi này dưới giới hạn.
Nếu nó đang thực hiện một dấu cộng đến cuối chuỗi, bạn sẽ gặp phải lỗi vượt quá giới hạn.
Bạn luôn phải cẩn thận giống như một số học số nguyên để không đi quá giới hạn cho một mảng.
Nhưng rất đơn giản, nó liên quan rất chặt chẽ đến thời điểm bạn thực hiện số
học con trỏ số nguyên.
Con trỏ ký tự số học cũng giống như vậy.
Nó thậm chí còn hữu ích hơn vì bây giờ bạn thực sự có thể xem các ký tự riêng lẻ mà không cần sử dụng chỉ số phụ.
Vì vậy, nếu chúng ta xem xét ví dụ trước đó
và chúng ta thực sự có thể tối ưu hóa nó hơn một chút bằng cách sử dụng con
trỏ để làm cho nó ít dòng mã hơn.
Vì vậy, bây giờ trong chuỗi sao chép của chúng ta, chúng ta thực hiện khai báo hàm này giống như trước, tạo
một vài con trỏ bằng cách sử dụng dấu hoa thị.
Nhưng chúng tôi không sử dụng vòng lặp for nữa vì sử dụng vòng
lặp for trong ví dụ trước là vô
nghĩa vì chúng tôi thực sự không cần khởi tạo biến điều khiển vòng lặp.
Tất cả những gì chúng ta cần làm là thoát khỏi một vòng
lặp với một điều kiện và sau đó chúng ta thực sự đang sử dụng các toán tử tăng và
giảm trong vòng lặp for, nhưng chúng ta thậm chí không cần phải làm điều đó.
Nó thực sự trở nên đơn giản hơn nhiều ở đây vì nếu chúng ta sử dụng vòng lặp
while, tất cả những gì chúng ta phải làm là nhìn vào vòng lặp while
và nó sẽ nhảy ra nếu nó trỏ đến một ký tự null vì ký tự
null thực sự bằng không.
Và vòng lặp while hãy nhớ rằng các Boolean trong c
được biểu diễn bằng các số nguyên, một là đúng và sau đó số 0
là sai hoặc thực sự số 0 là sai và sau đó bất kỳ điều gì khác là đúng.
Trong trường hợp này, ký tự null 0 là false, nó sẽ nhảy ra ngoài.
Vì vậy, tất cả những gì bạn phải làm đối với điều kiện thoát trong vòng lặp while là đặt một dấu hoa thị từ.
Đó là cái gì đang làm đó là tham khảo từ để xem giá trị của ký tự đó là gì.
Vì vậy, khi chúng ta đến cuối chuỗi mà chúng ta muốn sao chép từ đó, chúng ta sẽ nhảy ra ngoài.
Nếu không, chúng tôi chỉ thực sự đặt sửa đổi của chúng
tôi đối với con trỏ của chúng tôi ngay trong đó, hai cộng từ cộng cộng.
Bây giờ đây là một toán tử gia tăng bài đăng.
Vì vậy, điều này có nghĩa là cộng cộng nằm ở phía bên phải của biến.
Và khi bạn làm điều này, có nghĩa là bạn không
thêm một vào nó cho đến sau khi câu lệnh được hoàn thành.
Vì vậy, điều này sẽ làm, nó sẽ nói rằng ngôi sao 2 bằng bắt đầu từ.
Và sau khi câu lệnh đó được thực hiện, nó sẽ thêm vào 2 1 và nó sẽ thêm vào từ 1.
Nếu bạn đã có dấu cộng trước tên biến, nó sẽ thêm
vào biến đó trước khi nó thực thi câu lệnh đó và đó sẽ là một vấn
đề vì về cơ bản chúng ta sẽ bỏ lỡ phần tử đầu tiên được
sao chép trong chuỗi.
Nhưng chúng ta không cần thêm dòng mã nào nữa. Chúng tôi đang thực hiện phép tính và
phép gán con trỏ tăng dần trong cùng một câu lệnh, vì
vậy chúng tôi giảm mã đi một.
Một lần nữa, ký hiệu rất đơn giản.
Chúng tôi đang thực hiện một phép gán số học số nguyên rất dễ dàng.
Và cuối cùng, sau khi chúng ta hoàn tất việc sao chép tất
cả các chuỗi, chúng ta chỉ thêm vào cuối
ký tự null vào con trỏ mà chúng ta bỏ qua bởi vì cả hai thực sự là lý do
tại sao nó đi qua vòng lặp nó sẽ trỏ đến ký tự cuối cùng tính cách.
Vì vậy, nó chỉ là một chút dọn dẹp một chút ở đây.
Nó cho bạn thấy sức mạnh của con trỏ và cách
bạn có thể sử dụng con trỏ và số học trên cùng một dòng và với
các toán tử tăng và giảm này, các toán tử cộng và trừ này, nó làm cho nó
thậm chí còn nhanh hơn và dễ dàng hơn, vì vậy nó cũng hiệu quả hơn.
Nếu chúng ta muốn sử dụng các hàm chuỗi sao chép này, chúng ta có thể tạo hai mảng ký tự.
Chúng ta có thể truyền trực tiếp các mảng ký tự vào chuỗi sao chép vì các mảng ký
tự 0 là con trỏ.
Chúng là những con trỏ, vì vậy chúng tôi không thực sự phải hủy tham chiếu
chúng hoặc thêm địa chỉ hoặc bất cứ thứ gì. Chúng ta chỉ có thể nói string2, string1.
Và điều này sẽ làm là sao chép một chuỗi sẽ
được sao chép vào mảng ký tự string2 và sau đó in
nó ra bằng cách sử dụng printf.
Tôi muốn xem qua một ví dụ về cách bạn có thể sử dụng
con trỏ ký tự thay vì mảng ký tự và tại sao chúng đôi khi được ưu tiên.
Chúng tôi đã đề cập rằng đôi khi đó là sở thích của lập trình viên, trong
đó nếu bạn đã lập trình bằng các ngôn ngữ trước đó như Fortran,
bạn có thể được sử dụng để nâng cao. Nhưng nếu bạn có nó, bạn sẽ
thấy những lợi ích của việc sử dụng con trỏ.
Hy vọng điều này là hữu ích. Cảm ơn bạn.