Con trỏ C và mảng đa chiều

#include <stdio.h>

int main()
{
    int a[2] = { 3, 1 };
    int b[3] = { 4, 1, 5 };
    int c[4] = { 9, 2, 6, 5 };

    int* p[3];
    p[0] = a;
    p[1] = b;
    p[2] = c;
    printf("%d\n", *(p + 1)[1]); /*(1)*/
    return 0;
}

Trong trường hợp này (1) sẽ bằng 9 nhưng mình không hiểu lắm. Ai có thể giải thích được không ah.

Mình cũng học C, mình hiểu như sau, (p+1) tương đương với p[1] đều mang ý nghĩa cộng p lên 1.
Ở đây bạn viết *(p+1)[1] máy sẽ thực hiện lần lượt như sau:

  1. Cộng p lên 1 trong biểu thức (p + 1)
  2. Rồi tiếp theo nó sẽ thực hiện toán tử [1] tức là lại cộng (p + 1) thêm 1 ( (p + 1)[1] tương đương ((p + 1) + 1) = (p + 2)
  3. Và toán tử dereference * sẽ lấy giá trị của ô nhớ mà con trỏ (p + 2) trỏ tới, chính là p[2] hay c[0].
6 Likes

Thầy mình cũng nói như vậy. Nhưng mình vẫn chưa thấy thống não lắm.
Mình nghĩ là p+1 thì sẽ trỏ tới p[1] rồi trỏ tới phần tử thứ [1] của p[1] sẽ là 1.
Nhưng sự thật nó vẫn là 9 :slight_smile:

Cái này liên quan đến độ ưu tiên toán tử, sau khi thực hiện (p+1) máy nó sẽ có 2 toán tử có thể thực hiện là * hoặc [], thì nó chọn thực hiện [] trước rồi mới đến * .
Nếu bạn muốn hiển thị [1] của p[1] thì bạn phải ép máy thực hiện * trước bằng cách đưa nó vào trong ngoặc, biểu thức trở thành (*(p+1))[1], thì lúc này nó sẽ hiển thị 1.

1 Like

*((p+1)[1]) do * có thứ tự cao hơn [].
ta có (p+1)[1] là giá trị mà p+1+1 = p+2 trỏ đến, tức là c
*c = c[0] = 9.

3 Likes

Mình không biết trả lời sao. Nhưng hình như các bạn trả lời sai hết hay sao ý :smiley:

chắc nó là do lỗi của ngôn ngữ C này hay sao ý.
bạn cứ hiểu đơn giản là:
p[0] trỏ tới đầu mảng a[] rồi lấy p[0] +1 = p[1] hay p +1 = p[1] vậy thôi. cái bạn hỏi khá là nang giải

Vậy bạn sẽ trả lời như thế nào?

2 Likes

Đào mộ time. :slight_smile:

Câu trả lời là do độ ưu tiên toán tử. :slight_smile:

Nó sẽ thực hiện [] trước rồi mới *(p + 1).

Sửa lại thành (*(p + 1))[1] sẽ ra 1. :slight_smile:

1 Like

Bạn thấy câu trả lời của mình có liên quan không. :slight_smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?