2014-04-24 23 views
10

Trình khởi tạo mảng như trả lại { 'a', 'b', 'c' } là gì? Sự hiểu biết của tôi là sử dụng trình khởi tạo phân bổ các khối bộ nhớ tiếp giáp và trả lại địa chỉ cho khối đầu tiên.Bộ khởi tạo mảng là gì?

Các mã sau đây không làm việc:

char *char_ptr_1 = { 'a', 'b', 'c', '\0' }; 

Mặt khác, đây là dường như làm việc tốt:

char char_array[] = { 'a', 'b', 'c', '\0' }; 
char *char_ptr_2 = char_array; 

char_array cửa hàng địa chỉ để các khối bộ nhớ đầu tiên đó giải thích tại sao Tôi có thể chỉ định giá trị của char_array đến chat_ptr_2. Liệu C có chuyển đổi giá trị được trả về bởi trình khởi tạo thành thứ gì đó có thể được lưu trữ trong một con trỏ không?

Tôi đã xem trực tuyến và tìm thấy một vài câu trả lời đã nói về sự khác biệt giữa mảng và con trỏ nhưng chúng không giúp tôi.

+2

bạn muốn các ký tự Hợp chất trong C99. Ví dụ. 'char * char_ptr_2 = (char []) {'a', 'b', 'c', '\ 0'};' – BLUEPIXY

+0

Tuy nhiên, danh sách khởi tạo của một chữ cái hợp chất tuân theo các quy tắc tương tự như bất kỳ danh sách bộ khởi tạo nào khác. Hợp chất theo nghĩa đen chỉ phân bổ một đoạn dữ liệu ẩn danh trên ngăn xếp. Vì vậy, nó tương tự như tuyên bố một mảng và sau đó gán một con trỏ trỏ vào mảng đó. – Lundin

+0

Bạn có thể nói 'char * char_ptr_1 =" abc ";'. Tuy nhiên, GCC báo cáo nó là không được chấp nhận mà không có một sửa đổi 'const'. Có lẽ đó là bởi vì trình biên dịch không được yêu cầu để tạo ra một mảng duy nhất cho mỗi lần xuất hiện chuỗi ký tự. –

Trả lời

14

Trình khởi chạy không trả về mọi thứ cho mỗi lần. Chúng đưa ra các hướng dẫn của trình biên dịch như những gì đưa vào mục đang được khai báo - trong trường hợp này, chúng cho trình biên dịch biết những gì đưa vào các phần tử của một mảng.

Đó là lý do tại sao bạn không thể chỉ định trình khởi tạo cho con trỏ: bộ khởi tạo mảng cần phải được ghép nối với một mảng để có ý nghĩa với trình biên dịch.

Con trỏ có thể được khởi tạo bằng biểu thức con trỏ. Đó là lý do tại sao khởi trong việc kê khai

char *char_ptr_2 = char_array; 

của bạn hoạt động: trình biên dịch chuyển char_array đến một con trỏ, và khởi char_ptr_2 với nó.

4

Chúng là công cụ khởi tạo mảng, không phải biểu thức bình thường có giá trị. I. e., Một bộ khởi tạo mảng có thể chỉ sử dụng để khởi tạo một mảng. Đó là một cú pháp đặc biệt cho một sử dụng cụ thể, kết thúc của câu chuyện.

4

Nó không thực sự "trả về" bất cứ điều gì, nó được phân tích cú pháp thời gian biên dịch và một mảng được tạo ra. Một con trỏ cần trỏ đến một cái gì đó, bạn không thể gán cho nó một giá trị trực tiếp. Vì vậy, trước tiên bạn cần mảng, và sau đó con trỏ của bạn có thể trỏ đến nó.

6

nó được gọi là bộ khởi tạo mảng vì nó khởi tạo một mảng và không phải là con trỏ.

Đó chỉ là cú pháp C, tại sao tùy chọn con trỏ không được phép.

Các vấn đề liên quan