Giữa *char và char[] có khác nhau nhiều lắm không?

  1. Lập trình

Theo em hiểu thì:

+ *char là con trỏ kiểu chuỗi.Nó trỏ đến phần tử đầu tiên of chuỗi.Kích thước ko xác định.

+ char[] là mảng các kí tự có kích thước cố định.

Vậy thì dùng *char lợi hơn dùng char[] chăng? Mọi người có thể cho em thêm ý kiến về nó được không ạ? Em cảm ơn

Từ khóa: 

ngôn ngữ lập trình

,

lập trình

Có khác biệt khá nhiều nhé.

char* là con trỏ, nó có thể trỏ tới một vị trí bất kỳ nào đó trong bộ nhớ, giá trị của nó là địa chỉ của vùng nhớ mà nó trỏ tới. Do nó chỉ là 1 cái địa chỉ nên khi bạn mới tạo biến nó sẽ chẳng có ý nghìa gì. Bạn sẽ phải khởi tạo giá trị cho nó bằng cách cấp phát bộ nhớ. Kích thước vùng nhớ được cấp phát tùy vào tham số bạn truyền (runtime). Khi bạn cấp phát động thì vùng nhớ được cấp nằm trên heap.

char[] là mảng tĩnh, về cơ bản nó cũng là con trỏ, trỏ tới vị trí đầu tiên của mảng (hay vùng nhớ mà mảng này được cấp), kích thước của vùng nhớ này cố định và được xác định từ trước (compile time). Vùng nhớ chứa mảng này nằm trên stack.

Lợi hơn thì chắc là cấp phát động có lợi hơn, kích thước ko cần định nghĩa từ trước, stack cũng nhỏ nên ko thể cấp phát bộ nhớ tĩnh kích thước lớn. Tuy nhiên, nếu bạn cấp phát động bạn phải tự quản lý bộ nhớ mà bạn đã cấp phát, chương trình sẽ ko tự động thu thập lại bộ nhớ, do vậy khi ko dùng nữa bạn phải tự gọi lệnh giải phóng bộ nhớ.

Trả lời

Có khác biệt khá nhiều nhé.

char* là con trỏ, nó có thể trỏ tới một vị trí bất kỳ nào đó trong bộ nhớ, giá trị của nó là địa chỉ của vùng nhớ mà nó trỏ tới. Do nó chỉ là 1 cái địa chỉ nên khi bạn mới tạo biến nó sẽ chẳng có ý nghìa gì. Bạn sẽ phải khởi tạo giá trị cho nó bằng cách cấp phát bộ nhớ. Kích thước vùng nhớ được cấp phát tùy vào tham số bạn truyền (runtime). Khi bạn cấp phát động thì vùng nhớ được cấp nằm trên heap.

char[] là mảng tĩnh, về cơ bản nó cũng là con trỏ, trỏ tới vị trí đầu tiên của mảng (hay vùng nhớ mà mảng này được cấp), kích thước của vùng nhớ này cố định và được xác định từ trước (compile time). Vùng nhớ chứa mảng này nằm trên stack.

Lợi hơn thì chắc là cấp phát động có lợi hơn, kích thước ko cần định nghĩa từ trước, stack cũng nhỏ nên ko thể cấp phát bộ nhớ tĩnh kích thước lớn. Tuy nhiên, nếu bạn cấp phát động bạn phải tự quản lý bộ nhớ mà bạn đã cấp phát, chương trình sẽ ko tự động thu thập lại bộ nhớ, do vậy khi ko dùng nữa bạn phải tự gọi lệnh giải phóng bộ nhớ.