2013-01-11 45 views
9

Tôi đọc một đoạn mã, trong đó cókhởi tạo tĩnh const char * someVar

#include ... 

static char const *program_name; 

... 
int main(int argc, char** argv){ 
program_name = argv[0]; 

... 
} 

Tôi đang tự hỏi làm thế nào mà chính giá trị hàm assign cho một biến const. Bất kỳ trợ giúp sẽ được đánh giá cao!

Trả lời

12

Việc kê khai:

static char const *program_name; 

nói program_name là một (variable) con trỏ tới ký tự không đổi. Con trỏ có thể thay đổi (vì vậy nó có thể được gán trong main()), nhưng chuỗi chỉ vào không thể thay đổi thông qua con trỏ này.

So sánh và tương phản với:

static char * const unalterable_pointer = "Hedwig"; 

Đây là một con trỏ hằng số liệu biến; con trỏ không thể thay đổi, tuy nhiên nếu chuỗi nó được khởi tạo để trỏ vào không phải là một nghĩa đen, chuỗi có thể được chỉnh sửa:

static char owls[] = "Pigwidgeon"; 
static char * const owl_name = owls; 

strcpy(owl_name, "Hedwig"); 

/* owl_name = "Hermes"; */ /* Not allowed */ 

Ngoài ra so sánh và đối chiếu với:

static char const * const fixed_pointer_to_fixed_data = "Hermes"; 

Đây là một con trỏ liên tục đến dữ liệu không đổi.

+0

Cảm ơn hai ví dụ khác! Sau đó, tôi đoán rằng '* program_name' là' const' nếu khai báo theo cách ban đầu, tức là 'static char const * program_name;'. Đó có phải ý của bạn? – AoZ

+0

Chính xác. Bạn không thể viết '* program_name = 'a';' vì 'program_name' trỏ tới dữ liệu không đổi; bạn không thể sửa đổi dữ liệu thông qua con trỏ này (mặc dù các con trỏ khác cho cùng một dữ liệu có thể sửa đổi nó - trong trường hợp này, bạn có thể viết '* argv [0] = 'a';' nếu bạn muốn, mặc dù tôi có thể 't nghĩ về một lý do tốt cho muốn làm như vậy). –

7

program_name là một con trỏ đến const char, không phải là con trỏ const. Câu lệnh gán gán một giá trị cho con trỏ không tới con trỏ.

+0

Câu trả lời của bạn cũng có ý nghĩa, nhưng tôi thích lời giải thích chi tiết hơn của Jonathan. Tuy nhiên, cảm ơn! – AoZ

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