2010-05-30 47 views

Trả lời

2

Khai báo đầu tiên khai báo một mảng, trong khi thứ hai - một con trỏ.

Nếu bạn quan tâm đến sự khác biệt ở một số khía cạnh cụ thể, vui lòng làm rõ câu hỏi của bạn.

9

char a[]="string"; // a là một mảng các ký tự.

char *p="string"; // p là chuỗi ký tự có phân bổ tĩnh. Bất kỳ nỗ lực nào để sửa đổi nội dung của p đều dẫn đến Hành vi không xác định vì chuỗi ký tự chuỗi được lưu trữ trong phần chỉ đọc của bộ nhớ.

2

Không có sự khác biệt. Trừ khi bạn muốn thực sự ghi vào mảng, trong trường hợp đó cả thế giới sẽ phát nổ nếu bạn cố gắng sử dụng biểu mẫu thứ hai. Xem here.

27

Thứ nhất là mảng kia là con trỏ.

Việc kê khai mảng "char a[6];" yêu cầu không gian cho sáu nhân vật được đặt sang một bên, được biết đến bởi cái tên "a." Đó là, có một vị trí có tên là "a" mà tại đó sáu nhân vật có thể ngồi. Mặt khác, việc khai báo con trỏ "char *p;" yêu cầu một nơi giữ con trỏ. Con trỏ được biết đến với tên "p," và có thể trỏ đến bất kỳ char (hoặc mảng liền kề của ký tự) bất cứ nơi nào.

Báo cáo

char a[] = "hello"; 
char *p = "world"; 

sẽ cho kết quả trong cấu trúc dữ liệu mà có thể được biểu diễn như thế này:

+---+---+---+---+---+---+ 
a: | h | e | l | l | o |\0 | 
    +---+---+---+---+---+---+ 
    +-----+  +---+---+---+---+---+---+ 
p: | *======> | w | o | r | l | d |\0 | 
    +-----+  +---+---+---+---+---+---+ 

Điều quan trọng là nhận ra rằng một tài liệu tham khảo như x [3] tạo ra đoạn mã khác nhau tùy thuộc vào x là một mảng hay một con trỏ. Với các khai báo ở trên, khi trình biên dịch thấy biểu thức a [3], nó phát ra mã để bắt đầu tại vị trí "a", di chuyển ba qua nó và tìm nạp ký tự ở đó. Khi nó thấy biểu thức p [3], nó phát ra mã để bắt đầu tại vị trí "p", tìm nạp giá trị con trỏ ở đó, thêm ba vào con trỏ và cuối cùng tìm nạp ký tự được trỏ tới. Trong ví dụ trên, cả hai [3] và p [3] xảy ra là ký tự 'l', nhưng trình biên dịch lại có cách khác.

Bạn có thể sử dụng tìm kiếm có rất nhiều giải thích về chủ đề trong internet thứ.

+4

bộ nhớ được cấp phát trong trường hợp đầu tiên và ở đâu trong trường hợp thứ hai? cây rơm? đống? khi bạn quyết định trỏ p đến somethng khác có nghĩa là "wrold" sẽ bị deallocated? – Laz

+6

+1 cho tác phẩm nghệ thuật ASCII. –

+3

@Ram Bhat: trong trường hợp đầu tiên, nó phụ thuộc vào vị trí của định nghĩa đó; nếu nó ở trong một hàm, có lẽ trên stack, nếu nó nằm trong một struct, nó phụ thuộc vào nơi mà toàn bộ struct được phân bổ; nếu nó nằm ngoài bất kỳ chức năng nào, trong phân khúc vars toàn cầu. Giữ nguyên cho con trỏ p; chuỗi "thế giới" mà p điểm, thay vào đó, * thường * nằm trong một phần cụ thể của tệp thực thi được ánh xạ trong bộ nhớ lúc tải, được sử dụng làm bảng chuỗi. –

1

Một khác biệt là sizeof (a) -1 sẽ được thay thế bằng độ dài của chuỗi tại thời gian biên dịch. Với p bạn cần sử dụng strlen (p) để có được độ dài khi chạy. Ngoài ra một số trình biên dịch không thích char * p = "string", chúng muốn const char * p = "string" trong trường hợp bộ nhớ cho "string" là chỉ đọc nhưng bộ nhớ cho a không phải là. Ngay cả khi trình biên dịch không yêu cầu khai báo const thì thực hành không tốt để sửa đổi chuỗi được trỏ tới bởi p (tức là * p = 'a'). Con trỏ p có thể được thay đổi để trỏ đến cái gì khác. Với mảng a, một giá trị mới phải được sao chép vào mảng (nếu nó phù hợp).

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