Việc chuyển nhượng để y bên trong thay đổi vuông chỉ có một bản sao của các đối số thực tế.
chức năng gọi là có thể thay đổi dữ liệu của người gọi nếu như dữ liệu là độc lập VISI-ble đến chức năng (ví dụ, trong một biến toàn cầu) hoặc nếu người gọi qua một con trỏ đến các dữ liệu như là một đối số cho hàm. Khi một con trỏ được thông qua, các con trỏ được sao chép, nhưng các đối tượng được trỏ tới không được sao chép. Do đó, những thay đổi được thực hiện gián tiếp thông qua các con trỏ có thể được nhìn thấy bởi người gọi.
Ví dụ
hoán đổi chức năng dưới đây trao đổi các giá trị của hai đối tượng số nguyên khi con trỏ đến các đối tượng được cung cấp như các thông số:
void swap (int * xp, int * yp)
{
int t ■ * xp?
* xp = * yp;
* yp = t;
}
Nếu a là một mảng số nguyên tất cả các phần tử của là 0, và tôi là một biến số nguyên với giá trị 4, sau đó khi hoán đổi cuộc gọi (& a [i ], & i), i sẽ có giá trị 0 và a [4] sẽ có giá trị 4.
lập luận chính thức và thực tế của các loại mảng luôn chuyển con trỏ bằng C. Do đó, thay đổi một tham số chính thức mảng trong một chức năng sẽ ảnh hưởng đến các argu¬ment thực tế, mặc dù nó không có vẻ rõ ràng rằng điều này là như vậy.
Ví dụ
xem xét các chức năng f sau đó có một tham số mảng:
void f (int a [10])
{
a [4] = 12; / * Thay đổi mảng của người gọi * /
}
Nếu vec là một mảng số nguyên, sau đó gọi f (vec) sẽ thiết lập vec [4] đến 12. Chiều 10 trong tham số mảng không có ý nghĩa một thể đã được khai báo int a [].
Nếu một hàm mà trả lại loại không phải là khoảng trống được gọi là trong một bối cảnh mà giá trị của hàm sẽ được loại bỏ, một trình biên dịch có thể đưa ra cảnh báo về việc đó. Tuy nhiên, nó được phổ biến cho các chức năng không là void như printf có giá trị trả lại của họ bỏ đi, và rất nhiều lập trình viên nghĩ rằng những cảnh báo như là một mối phiền toái.
Ví dụ
Mục đích để loại bỏ các kết quả của các cuộc gọi chức năng có thể được thực hiện rõ ràng bằng cách sử dụng một dàn diễn viên , như trong cuộc gọi này để điều trị s ,:
(void) streattword, hậu tố);
biểu Comma có thể đối số cho hàm nếu chúng được kèm theo trong parenthe-ses để các bộ phận của họ không được giải thích như là tham số riêng biệt.
Ví dụ
Giả sử bạn muốn theo dõi tất cả các cuộc gọi đến một hàm f trong chương trình C của bạn. Nếu f có một argu¬ment duy nhất, sau đó các macro sau sẽ chèn các cuộc gọi đến traeef trước mỗi cuộc gọi đến f.
«xác định f (x) (traeef LIME), f ((x)))
đang được dịch, vui lòng đợi..
