2010-09-22 64 views
26

Tôi đang chuyển đổi tệp tiêu đề cho một DLL được viết bằng C sang Delphi để tôi có thể sử dụng DLL.sự khác biệt giữa int * i và int * i

Câu hỏi của tôi là sự khác biệt giữa

int* i 

int *i 

tôi chuyển đổi người đầu tiên

i: PInteger; 

là gì Nhưng tôi không chắc chắn về chuyển đổi chính xác là cho cái thứ hai ở Delphi.

từ sự hiểu biết của tôi đầu tiên là một con trỏ được nhập đơn giản. Thứ hai là một biến con trỏ. nhưng tôi không chắc sự khác biệt là gì.

+0

bản sao có thể có của [Trong C, tại sao dấu hoa thị trước tên biến, thay vì sau loại?] (Http://stackoverflow.com/questions/398395/), [Kiểu con trỏ ưa thích của bạn là gì và Tại sao?] (http://stackoverflow.com/questions/377164/) – outis

Trả lời

27

int* iint *i là hoàn toàn tương đương

+0

Vì vậy, sự khác biệt trong tiêu đề DLL là thiếu tính nhất quán hoặc lỗi chính tả. thanks – MikeT

+0

Nếu bạn định dành thời gian để cảm ơn anh chàng, bạn có thể chấp nhận câu trả lời của anh ấy không? –

+20

xin lỗi nhưng tôi không thể chấp nhận câu trả lời ngay lập tức do câu hỏi được trả lời quá nhanh. tôi nhận được một thông báo cho tôi biết rằng tôi chỉ có thể chấp nhận câu trả lời trong 11 phút – MikeT

4

Không có sự khác biệt. Bạn có thể nhập nó là int * i nếu bạn muốn; tất cả chúng đều có cùng ý nghĩa: "i là một con trỏ đến một int."

44

Theo như C, cả hai đều thực hiện tương tự. Đó là vấn đề ưu tiên. int* i hiển thị rõ ràng rằng đó là loại con trỏ int. int *i cho thấy thực tế là dấu hoa thị chỉ ảnh hưởng đến một biến duy nhất. Vì vậy, int *i, jint* i, j cả hai sẽ tạo ra i làm con trỏ int và j làm int.

+21

+1 để giải thích 'int * i, j' caveat – pmg

+0

nghĩ rằng tôi thực sự biết điều này nhưng đã hơn 10 năm kể từ khi tôi đã làm bất kỳ mã hóa C/C++. – MikeT

+0

Bạn không yêu những ngôn ngữ quirks :-) Tôi rất vui vì tôi đã hoàn toàn quên về điều đó, nhưng nó là tốt để xem nó ghi nhận một nơi nào đó với một đánh giá cao. –

2

Điều tương tự.

Một số nhà phát triển thích ký hiệu int* i vì cách này loại i rõ ràng là "con trỏ đến một int" trong khi int *i có vẻ ít đọc được hơn.

+0

Tôi tò mò tại sao bạn nghĩ rằng sau này là ít có thể đọc được? Cảm ơn. – johnny

2

int* i, int * i, int*iint *i hoàn toàn giống nhau. Điều này xuất phát từ trình biên dịch C (và nó tương thích với các hệ thống như C) bỏ qua không gian màu trắng trong luồng mã thông báo được tạo ra trong quá trình phân tích cú pháp mã nguồn.

Một số người thích sử dụng int* i nghĩ rằng nó làm cho mã sạch hơn (vì chỉ thị con trỏ được xem là một phần của loại trong tâm trí của họ). Một số người thích sử dụng int *i nghĩ rằng nó làm cho mã sạch (vì kiểu là một int, và họ có một "con trỏ" với nó). Cả hai kỹ thuật không thực sự làm bất cứ điều gì khác nhau sau khi trình biên dịch chạy qua mã nguồn. Khi nghi ngờ, bắt chước phong cách hiện có.

9

Chúng giống nhau. Hai kiểu khác nhau xuất phát từ cú pháp trong cú pháp C.

Một số người thích int* i;int* là loại i.

Những người khác thích int *i; vì trình phân tích cú pháp đính kèm dấu sao vào biến và không phải loại. Điều này chỉ trở nên có ý nghĩa khi bạn cố gắng xác định hai biến trên dòng. Bất kể thế nào bạn viết:

int* i,j; 
int*i,j; 
int *i,j; 

trong mỗi người, i là một con trỏ đến một int, trong khi j chỉ là một int.Cú pháp cuối cùng làm cho rằng rõ ràng hơn, mặc dù, thậm chí tốt hơn sẽ là:

int j, *i; 

hoặc tốt nhất được nêu ra:

int *i; 
int j; 
9

Đây là một tai nạn của cú pháp C mà bạn có thể viết hoặc int *i hoặc int* i hoặc thậm chí int * i. Tất cả chúng được phân tích cú pháp là int (*i); IOW, * bị ràng buộc với người khai báo, không phải là trình chỉ định kiểu. Điều này có nghĩa là trong các tờ khai như

int* i, j; 

chỉ được khai báo là một con trỏ; j được khai báo là int thường xuyên. Nếu bạn muốn khai báo cả trong số họ là con trỏ, bạn sẽ phải viết

lập trình viên
int *i, *j; 

Hầu hết C sử dụng T *p như trái ngược với T* p, vì a) khai báo trong C là biểu hiện tập trung, không phản đối tập trung, và b) nó phản ánh chặt chẽ hơn cú pháp khai báo.

Ví dụ về ý nghĩa của biểu thức là trung tâm, giả sử bạn có một chuỗi con trỏ tới int và bạn muốn lấy giá trị số nguyên ở phần tử i. Biểu thức tương ứng với giá trị đó là *a[i] và loại loại của biểu thức là int; do đó, việc khai báo mảng là

int *a[N]; 

Khi bạn thấy cụm từ "khai báo bắt chước sử dụng" liên quan đến lập trình C, điều này có nghĩa là gì.

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