1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Nhận đào tạo lập trình c mảng và con trỏ

Chủ đề trong 'Tìm bạn/thày/lớp học ngoại ngữ' bởi FrankLee, 30/03/2016.

  1. 1 người đang xem box này (Thành viên: 0, Khách: 1)
  1. FrankLee

    FrankLee Thành viên mới

    Tham gia ngày:
    07/03/2016
    Bài viết:
    31
    Đã được thích:
    0
    Con trỏ và mảng
    Trong C , các con trỏ và mảng có mối liên quan khá gần gũi. Các con trỏ rất bổ ích trong việc thao tác với mảng. Việc khai báo một con trỏ tới một mảng thì giống như với một con trỏ nguyên hay con trỏ số thực.



    int *ptr;
    int arr[5];
    ptr = &arr[0];
    Như bạn thấy ở trên , con trỏ chứa địa chỉ của phần tử đi hàng đầu của mảng. C cung cấp một cách khác để trỏ tới phần tử đi hàng đầu của mảng , ptr = arr;

    Ghi chú: Cần nhớ rằng tên của một con mảng mà không có kèm chỉ số thì nó là một con trỏ trỏ tới phần tử đi hàng đầu của mảng.

    Khi một con trỏ được thiết lập trỏ tới một phần tử của một mảng thì có khả năng dùng toán tử tăng ++ và giảm -- để trỏ tới các phần tử liền sau hoặc liền trước tương ứng trong mảng ,. Nhưng việc tăng giảm con trỏ để trỏ vượt quá cỡ của mảng sẽ sinh một lỗi runtime , và chương trình của bạn sẽ có khả năng treo ( crash ) hoặc ghi đè lên các dữ liệu khác hoặc đoạn mã khác của chương trình của bạn. Bởi thế lập trình viên phải đảm bảo mình sử dụng con trỏ tới một mảng một cách thành thạo.

    Một yếu tố khác phải cân nhắc đó là kích tấc của dữ liệu mà con trỏ trỏ tới. Giả như rằng một con trỏ nguyên trỏ tới một mảng nguyên; khi bạn tịnh tiến con trỏ lên , con trỏ sẽ trỏ tới phần tử tiếp theo trong mảng. Nhưng thực tế , con trỏ đó sẽ lưu giá trị mà thường là sẽ lớn hơn 4 byte so với địa chỉ phần tử đi hàng đầu của mảng.

    quy tắc biến chuyển mảng
    Nếu arr1 là một mảng , thì biểu thức arr1 + 1 sẽ cho địa chỉ của phần tử thứ 2 trong mảng bất kể kiểu dữ liệu của arr1. bây giờ chúng tôi có khả năng sử dụng toán tử gián tiếp * đứng phía trước tên biến để lấy giá trị được chứa trong địa chỉ này. Như vậy

    *( arr1 + 1 )

    sẽ cho giá trị được lưu trong phần tử thứ 2 của mảng. Cặp ngoặc đơn là bắt buộc bởi chưng toán tử * có độ ưu tiên cao hơn toán tử cộng. Bởi thế chúng tôi có khả năng sử dụng quy tắc biến chuyển này để chuyển đổi bất kể mảng nào được tham chiếu tới bằng các biểu thức với con trỏ tương đương.

    arr1[0] tương đương với *( arr1 + 0 )
    arr1[1] tương đương với *( arr1 + 1 )
    arr1[2] tương đương với *( arr1 + 2 )

    Nếu không có cặp ngoặc đơn thì phép toán *arr1 + 1 sẽ cho một Cuối cùng khác hoàn toàn , giống như lấy giá trị được lưu bởi phần tử đi hàng đầu của mảng và cộng thêm 1.

    Cấp phát bộ nhớ và con trỏ
    Định nghĩa mảng cho ta biết một khối nhớ được dự trữ riêng bởi hệ điều hành trong quá trình bắt đầu thực thi chương trình , điều này không xảy ra nếu mảng được đại diện bởi một biến con trỏ Việc sử dụng một biến con trỏ đề nghị lập trình viên phải thực hiện một số kiểu cấp phát bộ nhớ trước khi các phần tử mảng được sử dụng. Phương thức này gọi là Cấp phát bộ nhớ động . Hàm malloc( ) trong thư viện hàm C chuẩn được sử dụng cho mục tiêu này.
    Nguồn : lập trình c nâng cao

Chia sẻ trang này