Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đọc từ phải qua trái, dịch ra tiếng Việt là thế này:
    int = số nguyên
    * = con trỏ tới
    [N] = mảng chứa N


    int *A[3] đọc là: A là mảng chứa 3 con trỏ tới số nguyên.
    chi tiết: A là tên của biến, ưu tiên đọc trước. Tiếp theo đọc từ phải sáng trái: ngoài cùng bên phải là [3], đọc là "mảng chứa 3", tiếp theo là *, đọc tiếp là "con trỏ tới", cuối cùng là int, đọc tiếp là "số nguyên". Ghép lại là "A là mảng chứa 3 con trỏ tới số nguyên".

    int (*A)[3] đọc là: A là con trỏ tới mảng chứa 3 số nguyên.
    tương tự vẫn đọc từ phải sang trái, nhưng lần này có () thì ưu tiên đọc trong () trước: (A là con trỏ tới) + mảng chứa 3 + số nguyên


    (hình như mảng trong C++ quy định phải nằm sau tên biến nên mới rối như vầy. Nếu viết là int* [3] A; hoặc int[3]* A thì dễ đọc hơn)

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi theiron97
    Các bạn phân biệt hộ mình 2 cách viết này với :
    int *A[3];
    int (*A)[3];

    Mình cảm ơn.
    Để đọc khai báo trong C/C++, bạn cần nắm rõ thứ tự ưu tiên của các phép toán (operators). Đây là các phép toán, liệt kê theo thứ tự ưu tiên từ cao đến thấp, mà mình nghĩ bạn nên thuộc:

    - (): hàm, []: mảng (hai toán tử này có cùng độ ưu tiên)
    - *: con trỏ

    Chú ý () cũng được dùng cho cặp ngoặc đơn, và nó luôn có độ ưu tiên cao nhất.

    Khi đọc một khai báo thì nên bắt đầu với tên biến/tên hàm (identifier) trước. Toán tử nào có độ ưu tiên cao thì đọc trước. Trong ví dụ của bạn:

    int *a[3]: Bắt đầu với a và nó có hai toán tử * và []. Toán tử [] có độ ưu tiên cao hơn *, nên đọc nó trước, và a sẽ là mảng 3 phần tử. Tiếp theo là *, nên các phần tử sẽ là kiểu con trỏ. a là mảng 3 con trỏ kiểu int.

    int (*a)[3]: Cặp () có ưu tiên cao hơn [], nên * sẽ được đọc đầu tiên, và a sẽ là con trỏ. Tiếp theo là [], nên con trỏ sẽ trỏ tới mảng 3 phần tử kiểu int. a là con trỏ tới mảng 3 phần tử kiểu int.

    Khai báo sẽ phức tạp hơn khi có cả mảng và con trỏ hàm (function pointers). Ví dụ:

    int (*p)(void): p là con trỏ tới hàm trả về kiểu int.

    int *(*p)(void): p là con trỏ tới hàm trả về kiểu con trỏ int.

    int (*a[10])(void): a là mảng 10 con trỏ tới hàm trả về kiểu int.

    int (*f(void))[10]: f là hàm (do () hàm có độ ưu tiên cao hơn *) trả về con trỏ (dấu *) tới mảng 10 int.

    int (*f(void))(void): f là hàm trả về con trỏ tới hàm trả về int.

    Thực ra thì bạn chỉ cần đọc một vài khai báo "chuối" là sẽ quen. Dưới đây cũng là một khai báo trong C/C++. Bạn có thể thử xem nó khai báo gì:

    Mã:
    int (*(*(*hell[1])(void *(*)(void)))[1])(void *(*)(void));
    Dĩ nhiên là trong thực tế chắc sẽ không có khai báo kiểu này. Nó chỉ để luyện tập thôi.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ok thanks các bạn , thế thì cái thứ 2 có tác dụng làm gì nhỉ ?

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •