Khác với sự phân biệt mô này, một mảng hai chiều có thể được điều trị trong cùng một cách như trong các ngôn ngữ khác. Yếu tố được lưu trữ bởi hàng, do đó, chỉ số bìa phải, hoặc cột, thay đổi nhanh nhất vì yếu tố được truy cập trong thứ tự lưu trữ. Một mảng được khởi tạo bởi một danh sách các initializers ở trong ngoặc; mỗi hàng của một mảng hai chiều được khởi tạo bởi một danh sách tương ứng phó. Chúng tôi bắt đầu mảng daytab với một cột zero do đó số lượng tháng có thể chạy từ 1 đến 12 tự nhiên thay vì 0-11. Từ space không phải là một phí bảo hiểm ở đây, điều này là rõ ràng hơn so với việc điều chỉnh các chỉ số. Nếu một mảng hai chiều là được truyền cho một hàm, tuyên bố tham số trong các chức năng phải bao gồm số lượng các cột; số hàng là không thích hợp, vì những gì được thông qua, như trước đây, một con trỏ đến một loạt các hàng, mỗi hàng ở đâu một mảng 13 một. Trong trường hợp cụ thể này, nó là một con trỏ đến các đối tượng là mảng của 13 một. Do đó nếu daytab mảng để được truyền cho một hàm f, tuyên bố của f sẽ là: f (int daytab[2][13]) {...} Nó cũng có thể là f (int daytab[][13]) {...} kể từ khi số hàng là không thích hợp, hoặc nó có thể là f (int (*daytab)[13]) {...} mà nói rằng các tham số là một con trỏ chỉ tới một mảng số nguyên 13. Các dấu ngoặc đơn là cần thiết vì dấu ngoặc vuông [] có các ưu tiên cao hơn *. Mà không có dấu ngoặc đơn, kê khai int * daytab [13] là một mảng của các con trỏ 13 số nguyên. Nói chung, chỉ đầu tiên kích thước (chỉ số) của một mảng là miễn phí; Tất cả những người khác có thể được xác định. Phần 5.12 có một cuộc thảo luận thêm trong tờ khai phức tạp. Tập 5-8. Có là không có lỗi, kiểm tra tại day_of_year hoặc month_day. Khắc phục lỗi này. 5.8 các khởi tạo của con trỏ mảng xem xét vấn đề của việc viết một chức năng month_name(n), mà trả về một con trỏ đến một nhân vật chuỗi chứa tên của n-th tháng. Đây là một ứng dụng lý tưởng cho một mảng tĩnh bên trong. month_name có một mảng riêng của chuỗi ký tự, và trả về một con trỏ đến một thích hợp khi được gọi là. Phần này cho thấy làm thế nào là mảng tên được khởi tạo. Cú pháp cũng tương tự như trước đây initializations: / * month_name: trở về tên của n-th tháng * / khai báo tên, là một mảng của các con trỏ ký tự, là giống như lineptr trong ví dụ sắp xếp. The initializer là một danh sách các chuỗi ký tự; từng được gán cho các vị trí tương ứng trong mảng đó. Các nhân vật của chuỗi lần thứ i được đặt ở một nơi, và một con trỏ đến chúng được lưu trữ trong tên [i]. Kể từ khi kích thước của mảng tên không được chỉ định, trình biên dịch đếm các initializers và điền vào số chính xác. 5.9 liên kết vs Multi-dimensional mảng người mới đến C đôi khi bị nhầm lẫn về sự khác biệt giữa một mảng hai chiều và một mảng của các con trỏ, chẳng hạn như tên trong ví dụ ở trên. Đưa ra những định nghĩa int a [10] [20]; int * b [10]; sau đó một [3] [4] và b [3] [4] là cả hai tham chiếu pháp lý cú pháp để đơn int. Nhưng một là một mảng hai chiều thực sự: 200 int có kích thước vị trí đã là đặt sang một bên, và tính toán subscript hình chữ nhật thông thường 20 * hàng + col được sử dụng để tìm các phần tử a [row, col]. Cho b, Tuy nhiên, định nghĩa chỉ phân bổ 10 con trỏ và không khởi tạo cho họ; khởi tạo phải được thực hiện một cách rõ ràng, tĩnh hoặc với mã. Giả sử rằng mỗi phần tử của b trỏ đến một mảng twentyelement, sau đó sẽ có 200 một sang một bên, cộng với các tế bào mười cho các con trỏ. Lợi thế quan trọng của con trỏ mảng là các hàng của các mảng có độ dài khác nhau.
đang được dịch, vui lòng đợi..
