Nhận kích thước của mảng động C++
Đối với một mảng có kích thước cố định (không động), việc tính toán kích thước có vẻ phức tạp nhưng thực sự khá đơn giản khi chúng ta nghĩ về cách hoạt động của toán tử sizeof Show sizeof sẽ mang lại kích thước tính bằng byte của một biến hoặc cấu trúc dữ liệu. Do mảng là cấu trúc dữ liệu tuyến tính để lưu trữ tuần tự các phần tử cùng loại, chúng ta có thể lấy kích thước của cấu trúc dữ liệu mảng bên dưới rồi chia cho kích thước của một phần tử trong mảng Tại sao điều này làm việc?Lý do chúng tôi có thể làm điều này khá đơn giản và được dự định. Để phá vỡ mọi thứ, hãy lấy đoạn mã sau Vì chúng tôi không làm việc với một mảng động có kích thước thay đổi, nên kích thước của mảng số nguyên 0 bằng 8 hoặc nhiều hơn 1Trong C++ và khi làm việc trên máy 32/64 bit. Một 2 "thường" là một số nguyên có độ rộng cố định (32 bit) được biểu thị dưới dạng 4 byte. Bất kỳ giá trị số nguyên có độ rộng cố định nào cũng có thể được chia nhỏ kích thước thành byte và bit dựa trên định nghĩa của một 0 đối với kiến trúc máy tính của bạn
Do đó, 4 và chúng ta biết một byte bằng 8 bit nên phương trình trở thành
Giải quyết số byte 5, chúng ta có thể kết luận 0 bằng 4 byte. Đối với một số nguyên có độ rộng cố định phổ biến khác, số nguyên 64 bit, nó sẽ được biểu thị dưới dạng 8 byte. Bây giờ, hãy quay lại mã và tính toán kích thước của mảng để lặp lại tất cả các phần tửBởi vì 1 mang lại số byte mà cấu trúc dữ liệu đại diện, khi chúng tôi sử dụng 2, chúng tôi nhận được 24 byte do mảng lưu trữ 6 giá trị với kiểu dữ liệu 2 chiếm 4 byte mỗi giá trị. Kích thước mà chúng ta đã khởi tạo mảng là 6, vì vậy điều đó có nghĩa là chúng ta có 6 * 4 = 24 byte được đại diện bởi arr trong bộ nhớTiếp theo, sử dụng 5, chúng ta có thể nhận được kích thước của một phần tử đã cho trong mảng sẽ biểu thị số byte mà mỗi phần tử được biểu thị bởi (vì tất cả các phần tử đều có cùng kiểu dữ liệu). Tôi thường lấy phần tử đầu tiên trong mảng 6 nhưng bất kỳ phần tử nào cũng được hoặc sử dụng một con trỏ tới arr như 8 cũng sẽ hoàn thành nhiệm vụ tương tự Một mảng Động (vector trong C++, ArrayList trong Java) tự động phát triển khi chúng ta cố gắng chèn và không còn khoảng trống cho mục mới. Thông thường khu vực tăng gấp đôi kích thước. Một mảng động đơn giản có thể được xây dựng bằng cách phân bổ một mảng có kích thước cố định, thường lớn hơn số phần tử được yêu cầu ngay lập tức. Các phần tử của mảng động được lưu trữ liền kề ở đầu mảng bên dưới và các vị trí còn lại ở cuối mảng bên dưới được dành riêng hoặc không được sử dụng. Các phần tử có thể được thêm vào cuối một mảng động trong thời gian không đổi bằng cách sử dụng không gian dành riêng cho đến khi không gian này được sử dụng hoàn toàn. Khi tất cả không gian được sử dụng và một phần tử bổ sung sẽ được thêm vào, mảng có kích thước cố định cơ bản cần được tăng kích thước. Thông thường, thay đổi kích thước rất tốn kém vì bạn phải phân bổ một mảng lớn hơn và sao chép tất cả các phần tử từ mảng mà bạn đã phát triển quá mức trước khi cuối cùng chúng tôi có thể nối thêm mục của mình. Tiếp cận. Khi ta nhập 1 phần tử vào mảng mà mảng đầy thì bạn tạo 1 hàm, hàm này tạo 1 mảng mới kích thước gấp đôi hoặc tùy ý bạn và copy tất cả phần tử của mảng trước sang 1 mảng mới và trả về mảng mới này. Ngoài ra, chúng ta có thể giảm kích thước của mảng. và thêm một phần tử tại một vị trí nhất định, xóa phần tử ở cuối mặc định và tại vị trí đó Các tính năng chính của mảng độngThêm phần tử. Thêm phần tử vào cuối nếu kích thước mảng không đủ thì mở rộng kích thước của mảng và thêm một phần tử vào cuối mảng ban đầu cũng như chỉ số đã cho. Thực hiện tất cả việc sao chép đó mất O(n) thời gian, trong đó n là số phần tử trong mảng của chúng ta. Đó là một chi phí đắt đỏ cho một append. Trong một mảng có độ dài cố định, việc nối thêm chỉ mất O(1) thời gian. Nhưng các phần bổ sung chỉ mất thời gian O(n) khi chúng ta chèn vào một mảng đầy đủ. Và điều đó khá hiếm, đặc biệt nếu chúng ta nhân đôi kích thước của mảng mỗi khi hết dung lượng. Vì vậy, trong hầu hết các trường hợp, việc nối thêm vẫn là thời gian O(1) và đôi khi là thời gian O(n). Trong mảng động, bạn có thể tạo mảng có kích thước cố định khi được yêu cầu thêm một số phần tử vào mảng, sau đó sử dụng phương pháp này. Xóa phần tử. Xóa một phần tử khỏi mảng, phương thức remove() mặc định xóa một phần tử từ cuối, chỉ cần lưu số 0 ở chỉ mục cuối cùng và bạn cũng xóa phần tử tại chỉ mục cụ thể bằng cách gọi phương thức removeAt(i) trong đó tôi là chỉ mục. phương thức removeAt(i) dịch chuyển tất cả phần tử bên phải ở phía bên trái từ chỉ mục đã cho. Thay đổi kích thước Kích thước mảng. Khi mảng có dữ liệu null/zero (ngoài một phần tử do bạn thêm vào) ở phía bên phải của mảng, nghĩa là nó có bộ nhớ chưa sử dụng, phương thức shrinkSize() có thể giải phóng bộ nhớ thừa. Khi tất cả không gian được sử dụng và một phần tử bổ sung sẽ được thêm vào, thì mảng có kích thước cố định bên dưới cần tăng kích thước. Thông thường, việc thay đổi kích thước rất tốn kém vì bạn phải phân bổ một mảng lớn hơn và sao chép tất cả các phần tử từ mảng mà bạn đã phát triển quá mức trước khi cuối cùng chúng tôi có thể nối thêm mục của mình. Mã đơn giản cho mảng động. Trong mã bên dưới, mảng sẽ có kích thước đầy đủ, chúng tôi sao chép tất cả phần tử sang mảng kích thước gấp đôi mới (mảng kích thước thay đổi). mã mẫu bên dướiJava 9 0 1 2 3
4 5 4 7 4 91________ 24 ________ 193 ________ 194 ________ 195 ________ 24 ________ 193 ________ 194 ________ 199 ________ 24 ________ 193 ________ 194 ________ 203 4 05
4 1 08 4 10________ 211 12 13 ________ 194 15 16 _______ 217 11 19 20 21 11 23 16 21 4 27 4 29
4 1 32 33 94 35 4 10
11 39 11 41 42________ 243 ________ 244 ________ 245 11 27 48 11 50 11 52 4 27
4 56 4 1 32 40 4 10
11 94 45____246 21 11 41 42
43 72 43 74 43 76 13 94 79 900 17 43 10 904 905 906 94 908 20 910 911 912 911 914 904 27 43 27 11 27
11____1922 11____1924 11 926 927 11____1929 11 931 900 21 4 27
4____1937 4____1939 4 1 32 943 4 10 11 94 45____246 21 11 41 953 20 955
43 957 43 74 43 76 13 94 964 43 905 906 94 908 20 971
904 912 904 914 43 27
43 979
43____1981 43____1924 43 926 11 27 4 27 4____1991
4 1 32 995 94 997 94 35 4 10 11 003 11 41 42 43 44 11 27
11 905 906 94 015 16 017
43____2019 43______2021 43 023______216 025 11 27
11____2029 11____2031 11 52 4 27
4____2037 4____2039 4 1 32 043 4 10 11 41 953 20 955 43 052____216 054 20 21 43 058 11 27 4 27
4 064 4____2066 4 1 32 070 94 072 4 10 11 41 953 20 955________ 243 905 ________ 1906 94 ________ 2084 16_______ 2086
904 088 904 066 904 092____216 17 43 27 43 052____216 054 20 21 43 058 11 27 4 27
4 1 111 32 113 4 10 11 117 13 119
11____2121 11 123____216 125 11 123 900 125 11 123 132 125 11 123 136 125 11 123 140 125 11 123 144 125 11 123 148 125 11 123 152 125 11 123 156 125
11____2159 11 161______2162 125 11 905 906 94 908 20 170 43 172 173 125 11 27
11____2178
11____2180 11 161______2183 184 11 161______2187 188 189 190
11____2192 11____2194
11____2196 11 161 199 188________ 2201 ________ 2202 ________ 2125 11 905 906 94 908 20 170 43 172 173 125 11 27 11____2178
11____2180 11 161______2183 184 11 161______2187 188 229____2190
11____2232 11 234 16 236 237 125
11____2240 11____2242 11 161______2245 188 247 248 125 11 905 906 94 908 20 170 43 172 173 125 11 27
11____2178
11____2180 11 161______2183 184 11 161______2187 188 229____2190
11____2278 11____2280
11____2282 11____2284 11 161______2245 188 289 290 125 11 905 906 94 908 20 170 43 172 173 125 11 27
11____2178
11____2180 11 161______2183 184 11 161______2187 188 189 190
11____2320 11 322 16 125
11____2326 11____2328 11 161____2245 188 247 334 125 11 905 906 94 908 20 170 43 172 173 125 11 27 11____2178
11____2180 11 161______2183 184 11 161______2187 188 229____2190 4 27 27Python3 366 367 2 369 370 4 372 4 374 4 376 4 378______2379 380 4 382____2379 20 4 386______2379 20 4 4____2391 4 393 394 395 396 11 395_______2399 379 15 20 403 404 906 16 407 11 395____2410 379 20 11 395____2415 379 16 11 4 420 4 393 33 395 425 426 11____2428 11 41 906____2395 410 379 379 395 437 43 395______2440 43 11____2443 11 395____2446 395 448 379 450 11 395____2410 188 379 16 11 4____2459 4 393 462 395 396 11 466 379 380 11 41 906____2395 410 379 379 395 437 478 43____2480 43____2482 43 466 379 15 20 403 404 906 395 415 404 900 407 43 497______2379 20 43 501 502____2395 437 505 904 507 904 509 379 395 512 904 497 188 379 16 904 11____2520 11____2522 11 395____2399 379 466 11 11____2530 11 395 415 379 395 415 404 900 11 4____2541 4 543 4 393 546 395 396 11 466 379 380 11 41 906____2395 557 20 396 478 43____2562 43____2482 43 466 379 15 20 403 404 906 395 574 43 497______2379 20 43 501 502____2395 583 505 904 507 904 509 379 395 512 904 497 188 379 16 43 395____2415 379 395 410 43 43 405 43____2522 43 395____2399 379 466 43 4 415 4 393 995______2395 420 426 11____2423 11 41 906____2395 410 379 379 395 437 43 395______2440 11 497 379 395 410 441 16 11 501 445______2379 447 478 43 450 43____2452 43 395____2455 188 16 403 379 395 512 43 497 441 379 16 43 11____2469 11 395____2472 379 450 11 395____2410 188 379 16 11 4____2483 4____2485 4 393 488 395 396 11 41 906____2395 557 20 396 43 395_______2446____2395 410 441 16 403 379 20 43 395____2410 441 379 16 4____2715 4 717 4 393 070 395 722 11 41 906____2395 557 20 396 43 497______2379 733 43 501 502____2395 410 441 16 396 505 904 744 904 717 904 395 512 379 395 455 188 16 403 904 497 188 379 16 43 395_______2446____2395 410 441 16 403 379 20 43 395____2410 441 379 16 4 778 4 393 781 11 783______2379 08 11 11____2788 11 123 16 407 11 123 900 407 11 123 132 407 11 123 136 407 11 123 140 407 11 123 144 407 11 123 148 407 11 123 152 407 11 123 156 407 11 11____19027 11 9029 906 162 407 11 497 379 20 11 501 9039 43 9029 906 9043 9044 188 173 9047 379 9049
Kích thước của mảng động là gì?Mảng động là mảng có cải tiến lớn. tự động thay đổi kích thước. Một hạn chế của mảng là chúng có kích thước cố định, nghĩa là bạn cần chỉ định trước số lượng phần tử mà mảng của bạn sẽ giữ. Mảng động sẽ mở rộng khi bạn thêm nhiều phần tử hơn . Vì vậy, bạn không cần phải xác định kích thước trước thời hạn.
Làm cách nào để khai báo kích thước mảng khi chạy trong C?int* arr = calloc (nb_elems, sizeof(int)); /* Làm gì đó với mảng của bạn, sau đó đừng quên giải phóng bộ nhớ */ free (arr
Tôi có thể tăng kích thước của mảng được cấp phát động trong C không?Thay đổi dòng cuối cùng thành 'return temp' và thu thập nó trong phần chính dưới dạng a=addnumber(&a,&size,2); Nhân tiện, thay vì xem qua tất cả những điều này . Nó làm tăng kích thước của mảng một cách linh hoạt. Sau khi sử dụng realloc, bạn chỉ cần thêm số mới vào chỉ mục cuối cùng.
Làm cách nào để trả về mảng động trong C?Trả về mảng bằng cách chuyển một mảng sẽ được trả về dưới dạng tham số cho hàm. . #include int *getarray(int *a) printf("Nhập các phần tử vào mảng. "); for(int i=0;i<5;i++) scanf("%d", &a[i]); |