Phương pháp yêu thích của bạn để khai báo một con trỏ là gì?
int* i;
hoặc là
int *i;
hoặc là
int * i;
hoặc là
int*i;
Hãy giải thích tại sao.
int*i;
- khoảng trắng không mọc trên cây, bạn biết đấy ...
Phương pháp yêu thích của bạn để khai báo một con trỏ là gì?
int* i;
hoặc là
int *i;
hoặc là
int * i;
hoặc là
int*i;
Hãy giải thích tại sao.
int*i;
- khoảng trắng không mọc trên cây, bạn biết đấy ...
Câu trả lời:
Nếu bạn viết:
int* i, j, k;
bạn đánh lừa một cách sai lầm rằng tất cả i, j và k là con trỏ tới int
.
Vì vậy, tôi cho rằng nó vượt trội hơn khi sáp nhập * vào tên biến.
int * i;
là một người không phải là đối thủ chỉ vì nó trông giống như nhân lên trong nháy mắt.
int*
được xem là một loại và int* i, j
khai báo hai con trỏ. Câu hỏi có thể được coi là không đầy đủ - nó phụ thuộc vào ngôn ngữ bạn đang sử dụng kiểu nào là hợp lý. Trong CI làm theo int *x
, trong C # tôi làm khác.
Tôi thích int* i
bởi vì i
có kiểu "con trỏ tới một int" và tôi cảm thấy điều này làm cho nó đồng nhất với hệ thống kiểu. Tất nhiên, hành vi nổi tiếng xuất hiện, khi cố gắng xác định nhiều con trỏ trên một dòng (cụ thể là dấu hoa thị cần được đặt trước mỗi tên biến để khai báo một con trỏ), nhưng tôi chỉ đơn giản là không khai báo con trỏ theo cách này. Ngoài ra, tôi nghĩ rằng đó là một khiếm khuyết nghiêm trọng trong các ngôn ngữ kiểu C.
*i
có một loại int
.
Đối với C, nơi chúng tôi không tập trung mạnh vào các loại, tôi thích:
int *i;
Bởi vì nó có một điểm nhấn trên int
, không phải con trỏ. Là gì int
? *i
là số nguyên
int i = 5
, để lấy giá trị i
, bạn sử dụng tên i
. Tương tự như vậy, nếu bạn có int *i; *i = 5
, sau đó để có được giá trị, bạn sử dụng *i
.
Tôi đã ưa thích int* i
trong nhiều năm. Tuy nhiên, có một lập luận mạnh mẽ int *i
vì khi sử dụng kiểu cũ, bạn vẫn phải nhớ quy tắc nhiều khai báo:
int* a, *b; // not int* a, b;
Bởi vì bạn phải nhớ quy tắc này, bạn sẽ không đạt được bất kỳ đơn giản nào nhưng tôi cũng không nói nó phức tạp hơn. Tránh nhiều khai báo trên một dòng chỉ là một cách khác để nói rằng bạn nhớ quy tắc này. Sự khác biệt giữa hai phong cách là moot.
Tuy nhiên, ngay cả khi tôi sử dụng nó, tôi cảm thấy hơi ngớ ngẩn khi giả vờ cú pháp khai báo C hoạt động khác với nó, bằng cách đặt dấu hoa thị bên cạnh loại chứ không phải là biến mà nó bị ràng buộc về mặt cú pháp.
Tôi không mua loại đó nhấn mạnh loại con trỏ (for i
) trong khi loại kia nhấn mạnh loại int (for *i
), nhưng đó có thể là sau 15 năm sử dụng C và C ++, đó chỉ là khi tôi nhìn vào nó, không có phải suy nghĩ về nó Một vài điều mà hầu hết những người mới bắt đầu hỏi câu hỏi này chưa thể làm được.
Ngoài ra, ngay cả khi được ưu tiên, tôi cũng không thấy khó xử khi đọc / viết mã theo kiểu khác. Kiên định, bla bla blah.
Không cần phải đề cập đến int * i
.
Tôi thích int* i
(C ++ - phong cách).
Tôi tránh khai báo nhiều biến trong một câu lệnh do sự mơ hồ về hình ảnh ( int* i, j
).
Xem thêm Câu hỏi thường gặp về Phong cách và Kỹ thuật C ++ của Bjarne Stroustrup cho các lý do.
Nếu bạn muốn khai báo nhiều biến nhưng không muốn lặp lại dấu hoa thị:
template <typename T>
struct pointer_to
{
typedef T* type;
};
pointer_to<int>::type p1, p2, p3;
(Như bạn có thể thấy bên trong mẫu struct, tôi thích int* i
kiểu này.)
Và đây là một giải pháp tổng quát hơn:
template <typename T>
struct identity
{
typedef T type;
};
identity<int*>::type p1, p2, p3;
Cái này hoạt động với bất kỳ "loại có vấn đề" nào, ví dụ như mảng và tham chiếu:
identity<int[10]>::type a1, a2, a3;
identity<int&>::type r1(*p1), r2(*p2), r3(*p3);
typedef int* int_ptr
sẽ thực hiện các mẹo. Chắc chắn, tôi phải khai báo một typedef mới cho các loại con trỏ khác nhau, nhưng trong thực tế sẽ có bao nhiêu? Tám nhiều nhất?
Tôi sẽ đi int* i;
vì phần đầu biểu thị loại biến (con trỏ đến int), trong khi phần thứ hai biểu thị tên ( i
). Nó sẽ không có ý nghĩa với tôi rằng loại int
và tên là *i
. Ngoài ra, int * i;
trông hơi giống như nhân với tôi.
Trong khai báo tôi sử dụng int * i;
, bạn đọc nó như là i is a pointer to an integer
.
Con trỏ đóng góp cho cả loại và biến vì vậy nó phải ở giữa.
Đó là một điều tốt để tránh khai báo nhiều điều trên cùng một dòng: int * i, j;
Tôi thực sự sử dụng cả ba quy ước trong hoàn cảnh cụ thể. Thoạt nhìn tôi có vẻ không nhất quán, nhưng ...
int *
khi định danh không có mặt, để củng cố một cách trực quan rằng tên không có mặt.int* intptr
trên typedef
s và các khai báo tương tự để củng cố trực quan rằng đó là một phần của loại. Tương tự với khai báo con trỏ hàm:(int* (*foo)(int))
int *identifier
và class &identifier
trên các tham số chức năng để củng cố một cách trực quan rằng tham số đó có khả năng là một tham số "ra".const int * const * const
Bất cứ khi nào tôi sử dụng vòng loại cv .int * foo;
trên tờ khai địa phương.Tôi đoán tôi hơi thiên về trực quan.
Không có loại con trỏ trong C! Vì vậy, "int *" có nghĩa là không có gì. Dấu hoa thị luôn bị ràng buộc với phần tử được viết bên phải của nó, nó thuộc về phần tử bên phải. "* i" là một số nguyên. Và vì * i là một int, nên theo sau tôi là một con trỏ tới int. Đó là logic đằng sau nó và đó là lý do tại sao "int * i" là giải pháp khả thi duy nhất. Mọi thứ khác chỉ là ảo ảnh (được trình biên dịch tự động sửa trong hầu hết các trường hợp). Trong C ++ và C # có gì đó khác biệt. Nhưng đối với C chỉ có một cuốn kinh thánh: "Dennis M. Ritchie: Ngôn ngữ lập trình C". Dennis (RIP!) Đã viết nó: "int * i". Không cần phải hỏi điều này.
int*
là một loại con trỏ.