01/10/2018, 08:37

Khó khăn với con trỏ

Em mới học con trỏ được 2 buổi, khái niệm về nó thì em đã vững nhưng đến lúc đưa con trỏ vào làm đối số của hàm thì thầy cô không nói rõ bản chất của nó nên em rất khó hiểu vd như đoạn chương trình

void Cong(int *p)
{
p++;
}
void main()
{
int a=5;
int *p=&a;
Cong(p);
}

thì thực chất chương trình sẽ làm những việc gì ? ( kết quả thì em có thể test được, thật sự em chỉ muốn nắm được các bước máy tính sẽ làm khi chạy code và hiểu BẢN CHẤT của vấn đề.)Em cảm ơn mọi người nhiều ạ

Người bí ẩn viết 10:44 ngày 01/10/2018

Theo mình thì nó như thế lày:

void Cong(int *p)
{
     p++; // Tăng giá trị (địa chỉ) của p lên 1 ô nhớ (4 bytes), tức là lúc này con trỏ p đang nằm ở ô nhớ kế tiếp ô nhớ của a
}
void main()
{
     int a = 5; // khai báo biến a có datatype là int và gán giá trị bằng 5
     int *p = &a; // khai báo con trỏ p và trỏ đến biến a
     Cong(p); // Gọi hàm Cong với tham số là con trỏ p (nếu giá trị của p thay đổi thì a cũng thay đổi theo)
}
IT viết 10:52 ngày 01/10/2018

void Cong(int *p)
{
p++;
}
void main()
{
int a=5;
int *p=&a;
Cong§;
}

Ở hàm main:

  • dòng thứ nhất int a = 5; là khai báo biến a có kiểu nguyên và gán cho nó giá trị là 5.
  • dòng thứ hai int *p = &a; là khai báo con trỏ p kiểu nguyên và cho nó trỏ đến vùng nhớ của biến a.
  • dòng thứ ba Cong§: gọi hàm con, ở đây là truyền tham trị chỉ truyền giá trị địa chỉ mà con trỏ đang nắm giữ, tức là địa chỉ của biến a. Khi vào chương trình con này nó tạo ra một biến con trỏ p (con trỏ p trong chương trình con này và hàm main hoàn toàn khác nhau, mặc dù cùng tên). Con trỏ p trong chương trình con này cũng nắm giữ địa chỉ của biến a. Sau khi thực hiện dòng p++ nghĩa là cho con trỏ p trong hàm Cong() trỏ đến địa chỉ bên cạnh biến a, nhưng không được phép thao tác trên vùng nhớ này vì chưa được cấp phát, và hàm con này không tác động gì đến biến a ở hàm main. Khi ra khỏi hàm con này thì biến p được khởi tạo ở hàm con cũng bị huỷ và không có tác động gì đến biến a và biến p ở hàm main cả.
Bài liên quan
0