Đây có thể là câu hỏi đơn giản, nhưng tại sao const char * không cần địa chỉ bộ nhớ để trỏ đến?
Thí dụ:
const char* a = "Anthony";
và không:
const char *a = // Address to const char
như bất kỳ loại khác làm gì?
Đây có thể là câu hỏi đơn giản, nhưng tại sao const char * không cần địa chỉ bộ nhớ để trỏ đến?
Thí dụ:
const char* a = "Anthony";
và không:
const char *a = // Address to const char
như bất kỳ loại khác làm gì?
Câu trả lời:
Bạn có thể tưởng tượng tuyên bố này
const char* a = "Anthony";
cách sau
const char string_literal[] = "Anthony";
const char *a = string_literal;
Đó là trình biên dịch tạo ra một mảng các ký tự có thời lượng lưu trữ tĩnh lưu trữ chuỗi "Anthony"
và địa chỉ của ký tự đầu tiên của mảng (do chuyển đổi ngầm định của các trình chỉ định mảng thành các con trỏ thành các ký tự đầu tiên của chúng) được gán cho con trỏ a
.
Dưới đây là một chương trình trình diễn cho thấy rằng chuỗi ký tự là các mảng ký tự.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
Đầu ra của chương trình là
The size of the referenced array is 8
Anthony
Kích thước của chuỗi ký tự (của mảng lưu trữ chuỗi ký tự) bằng với 8
vì chuỗi bao gồm cả ký tự 0 kết thúc ' \0'
.
Trong chương trình trình diễn biểu thức
std::extent<std::remove_reference<decltype( r )>::type>::value
có thể được thay thế cho chỉ biểu thức
sizeof( r )
Tại sao một const char không cần một địa chỉ bộ nhớ để trỏ đến? *
Nó làm.
Một chuỗi chữ C giống như
"Anthony"
được phân rã đến địa chỉ của ký tự thứ 1 của nó . Thích, BTW; bất kỳ mảng nào trong C không.
const char[8]
(trong C ++, có thể char [8]
bằng C, không chắc chắn) và giống như tất cả các mảng tích hợp, khi sử dụng nó làm giá trị, nó phân rã thành một con trỏ đến phần tử đầu tiên của nó.
char [8]
trong C: c-faq.com/ansi/strlitnotconst.html
Nó cần một địa chỉ bộ nhớ và nó có một địa chỉ bộ nhớ. Trong ví dụ của bạn, nó chỉ đơn giản là địa chỉ bộ nhớ ở đầu chuỗi. Nó giống với bất kỳ biến mảng nào khác được khởi tạo tại thời gian biên dịch, ví dụ "int mảng [] = {0, 1, 2, 3};".
Nếu bạn đã sử dụng trình soạn thảo nhị phân để xem tệp thực thi, bạn sẽ thấy chuỗi "Anthony" trong đó. Nếu bạn đặt dòng "printf (" a ở mức% p \ n ", (void *) a);" trong chương trình của bạn, sau đó biên dịch và chạy nó, bạn sẽ thấy địa chỉ.
"Tại sao
const char*
không cần một con trỏ đến một địa chỉ bộ nhớ?"
Trong thực tế, nó không cần một địa chỉ bộ nhớ để trỏ đến.
const char* a
có nghĩa a
là một con trỏ đến một chuỗi ký tự hoặc hằng ký tự.
Một con trỏ luôn yêu cầu một địa chỉ để trỏ tới vì đó là bản chất của một con trỏ để trỏ đến một đối tượng cụ thể trong bộ nhớ. Vì vậy, a
và bất kỳ con trỏ khác để const char
làm quá.
Một chuỗi ký tự giống như "Hi My Name is Alfred!"
bởi một bài tập như:
const char* a;
a = "Hi My Name is Alfred!";
phân rã thành một con trỏ tới địa chỉ của phần tử đầu tiên của chuỗi ký tự.
Có nghĩa là lần lượt, a
được gán bởi địa chỉ của phần tử đầu tiên của chuỗi ký tự "Hi My Name is Alfred!"
có thể được lưu trữ ở bất cứ đâu trong bộ nhớ phụ thuộc vào môi trường thực thi.
Nó không nằm trong khả năng của một lập trình viên nơi một chuỗi ký tự được lưu trữ chính xác. Nhiệm vụ của bạn chỉ là gán và xử lý con trỏ tương ứng một cách thích hợp.