C phép toán gán giá trị cho mảng 1 chiều năm 2024
nhắc tới con trỏ và mảng người ta sẽ nghĩ ngay tới mảng động.vậy mảng đọng là gì ? \=> Mảng động là mảng giống như mảng trước đó chúng ta học chỉ khác một điều là trước đây ta sài mảng tĩnh thì số lượng phần tử được khai báo trước và ta thường để dư ra. chẳng hạn mảng sài 5 – 10 phần tử nhưng ta khai báo 100,1000 phần tử=> Như vậy rất lãng phí bộ nhớ. còn mảng động chúng ta chỉ khai báo số lượng phần tử vừa đủ dùng sẽ giúp tiết kiệm bộ nhớ rất nhiều Con trỏ và mảngTrong C, các con trỏ và mảng có mối liên hệ khá gần gũi. Các con trỏ rất hữu í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]; // cách khai báo con trỏ và mảng khá giống nhau Con trỏ cung cấp một cách khác để trỏ tới phần tử đầu tiên 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ử đầu tiên 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ó thể 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ó thể 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. Vì 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 nhân tố khác phải cân nhắc đó là kích thước của dữ liệu mà con trỏ trỏ tới. Giả sử 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ử đầu tiên của mảng. Quy tắc biến đổi mảngNế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. Nếu bây giờ chúng ta có thể 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 cách 1 : printf ("a[1] = %d",a[1]); cách 2 : printf ("a[1] = %d",*(a+ 1)); cả 2 cách trên đều cho phép ta lấy giá trị phần tử thứ 2 của mảng.chúng 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 vì toán tử * có độ ưu tiên cao hơn toán tử cộng. Vì thế chúng ta có thể sử dụng quy tắc biến đổi này để chuyển đổi bất cứ 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 kết quả khác hoàn toàn, giống như lấy giá trị được lưu bởi phần tử đầu tiên 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ỏ yêu cầu 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 include |