01/10/2018, 15:49

Mong mọi người giải thích giúp em tại sao ar[*p++] = 3

int ar[] = { 10,15,4,25,3,-4 }, *p, i;
p = &ar[2];
Trần Hoàn viết 17:59 ngày 01/10/2018

Khi m == 3, nếu ta gọi n = m++; thì n == 3, m == 4

p = &ar[2];*p == ar[2] == 4

ar[*p++] == ar[*p](với p ban đầu) == ar[4] == 3

Nói thêm: *p++ chính là *(p++) nên sau khi gọi phép tính này, p sẽ trỏ đến ar[3] hay *p == 25

rogp10 viết 17:50 ngày 01/10/2018

Giải ra từ từ:
0. p là int* => *p là int, ar là int*. Về kiểu thì ổn.

  1. Dòng tiếp theo cũng như là p = ar + 2; Vậy *p là slot 2 bằng 4.
  2. Ta nhớ ++ trước * sau thì do post-increment nên lấy ngay *(ar + 4) là slot 4 bằng 3 rồi mới tăng p.
    Còn pre-increment thì phải +1 trước.
  3. Xong xuôi, p == ar + 3.
Cao Van Hung viết 17:59 ngày 01/10/2018

printf("%d\n", *p); // ra 5

Cám ơn a đã bớt thời gian để giải thích giúp em. Rất chi tiết và dễ hiểu ạ.
Thêm nữa là ở dòng code cuối cùng của anh, giá trị *p là 25 đúng ko a.

Cao Van Hung viết 17:59 ngày 01/10/2018

cám ơn a đã bớt chút thời gian để giải đáp giúp em. Em đã hiểu, cám ơn anh và cộng đồng nhiều

Cao Van Hung viết 18:02 ngày 01/10/2018

int ar[] = { 10,15,4,25,3,-4 }, *p, i;
p = &ar[2]; // p là biến con trỏ, nó trỏ tới vị trí ar[2]
printf("%d\n", *p); // in ra giá trị của con trỏ p, tức là in ra ar[2] == 4
printf("%d\n", ar[*p++]); // in ra ar[*p] == a[4] == 3,
// sau đó mới thực thi *p++,
// tức là tăng giá trị của con trỏ p lên 1 đơn vị
printf("%d\n", *p); // ra 5

e chạy code ra giá trị 25 chứ ko phải 5 anh ạ.

Bài liên quan
0