Con trỏ - Bài 4: Truyền địa chỉ biến qua nhiều hàm

Đôi khi địa chỉ biến được truyền qua một chuỗi các hàm trong 1 quy trình xử lý nào đó. Chẳng hạn ta muốn viết hàm ajust() để sau khi gọi ajust(&a, &b) thì nếu cần thiết ta phải hoán chuyển giá trị của a và b sao cho |a| <= |b| Trường hợp này, ajust() hàm nhận tham số địa chỉ biến và trong quá trình xử lý lại tiếp tục truyền các địa chỉ biến cho hàm swap() khi gọi hàm.

void swap(float *x, float *y)
{
float u = *x;
*x = *y;
*y = u;
}
void adjust(float *x, float *y)
{
if(fabs(*x) > fabs(*y))
//swap(&(*x), &(*y));
swap(x, y);
}
int main()
{
float a = -1845.3F, b = 234.3F;
adjust(&a, &b);
printf("\nNew values of a and b now are a = %.2f, b = %.2f", a, b);

getch();
return 0;
}
Hàm ajust() nhận 2 tham số x và y là địa chỉ của 2 biến số thực sẽ được gửi đến, tức là *x và *y có thể xem như chính là 2 biến số thực đó. Khi |*x| > |*y| thì chúng ta cần gọi hàm swap() để hoán chuyển nội dung của 2 biến gửi đến. Dòng mã thực hiện điều này là swap(&(*x), &(*y)) với ý nghĩa là đưa địa chỉ của các biến *x và *y đến hàm swap(). Tuy nhiên nếu diễn dịch kỹ thì &(*x) chính là "địa chỉ của biến mà x đang lưu địa chỉ": cụm từ này cho thấy &(*x) = x.

Nhận xét