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ảng

Trong 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ả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.

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 được sử dụng cho mục đích này:

cú pháp hàm mặc định :

void malloc (số_phần_tử * sizeof (kích thước kiểu dữ liệu đang dùng));

ví dụ :

include

main() { int x; float *y; x =(int ) malloc(10 sizeof(int)); / Cap phat bo nho cho 10 phan tu nguyen / y = (double ) malloc(10 sizeof(double)); / cap phat bo nho cho 10 so thuc cham phay dong*/ }

Ghi chú: hàm malloc() mặc định là kiểu void nên muốn dùng cần phải có kiểu dữ liệu giống với kiểu của biến con trỏ.

tức là phải ép kiểu cho hàm

Sự khác nhau giữa mảng và con trỏ

Có một số khác biệt chủ yếu giữa mảng và con trỏ. Một giá trị của con trỏ có thể bị thay đổi khi nó trỏ tới vùng nhớ khác. Nhưng con trỏ được đại diện bởi tên một mảng thì không thể bị thay đổi. Nó được xem như một hằng.

 float TotAmt[10];       TotAmt  ++; // cau lenh khong hop le       TotAmt -= 1; // cau lenh hop le

Một điểm khác cần nhớ đó là tên của mảng được khởi tạo bằng cách trỏ tới phần tử đầu tiên của mảng trong khi con trỏ không được khởi tạo khi khai báo. Chúng phải được khởi tạo tường minh trước khi sử dụng nếu không một lỗi run-time sẽ xuất hiện.

Stringee API cung cấp các tính năng như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài chăm sóc khách hàng (CSKH) có thể được nhúng trực tiếp vào các ứng dụng/website của doanh nghiệp nhanh chóng. Điều này giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp, trong khi nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.