Con trỏ - Bài 7 : Kết hợp sử dụng tham số con trỏ và giá trị trả về kiểu con trỏ

Trong nhiều tình huống, chúng ta có thể cần viết các hàm kết hợp sử dụng cả tham số con trỏ và giá trị trả về kiểu con trỏ. Chằng hạn hàm trả về chuỗi lớn hơn khi so sánh theo thứ tự alphabet. Hàm này có thể được mô tả là char* strmax(char* str1, char* str2); khi chuỗi str1 lớn hơn str2 (tức là đứng sau str2 theo thứ tự từ điển) thì hàm trả về str1, ngược lại trả về str2. Trường hợp này ta thấy hàm strmax() nhận vào các tham số là 2 con trỏ kiểu char* và cũng trả về con trỏ kiểu char*.

char* strmax(char* str1, char* str2)
{
if(strcmp(str1, str2) > 0)
{
return str1;
}
return str2;
}
Một trong những lợi thế của hàm trả về con trỏ là chúng ta có thể gọi lồng các hàm để viết mã gọn hơn. Chẳng hạn sau khi tìm chuỗi lớn nhất chúng ta có nhu cầu chuyển hết các ký tự trong chuỗi đó thành chữ hoa bằng cách gọi hàm strupr().

int main()
{
const int maxLen = 256;
char s1[maxLen], s2[maxLen];
printf("\nInput s1 = "); gets(s1);
printf("\nInput s2 = "); gets(s2);
printf("\nResult: %s", strupr(strmax(s1, s2))); // Gọi lồng hàm
getch();
return 0;
}
Bản thân hàm printf() cũng cho phép nhận vào thàm số con trỏ kiểu char* khi chúng ta dùng định dạng %s trong chuỗi định dạng in. Một điểm cần lưu ý thêm là 2 biến s1 và s2 được khai báo trong hàm main() dưới dạng 2 mảng ký tự, nhưng ý nghĩa sử dụng lại là các chuỗi ký tự. Khi truyền s1 và s2 đến hàm strmax() thì s1 tương đương &s1[0], còn s2 tương đương &s2[0]. Vì vậy cả 2 đối số s1, s2 là 2 địa chỉ bộ nhớ có kiểu là char*.

Nhận xét