2009-04-08 43 views
7

Tôi đã có một số mã tôi mantaining với việc kê khai biến sau đây:Đi qua C mảng như tham số chức năng char *

char tmpry[40]; 

Nó đang được sử dụng với chức năng này:

char *SomeFunction(char *tmpryP) { 
    // Do stuff. 
} 

Chức năng cuộc gọi là:

SomeFunction(&tmpry[0]); 

Tôi khá chắc chắn rằng điều này cũng giống như:

SomeFunction(tmpry); 

Tôi thậm chí đã kiểm tra con trỏ char * trong SomeFunction kết thúc trỏ đến cùng một vị trí bộ nhớ như mảng trong cả hai trường hợp.

Câu hỏi của tôi là kiểm tra sự chắc chắn về việc liệu hai cuộc gọi chức năng có giống hệt nhau không (và do đó lập trình ban đầu chỉ là khó chịu)?

+0

Tôi nghĩ rằng nó sẽ là tốt để vượt qua một thời gian cũng để SomeFunction, chỉ trong trường hợp ... :) –

+1

Tên của mảng ký tự là một bí danh cho địa chỉ của phần tử đầu tiên của mảng. – David

+0

Xin chào, tôi là một trong những lập trình viên "khó chịu" đã viết như thế này. Nói chung, tôi làm điều này trong mã C++, vì lý do kết nối ít hơn với trừu tượng mảng được sử dụng tại thời điểm này. I E. cho một cấu trúc dữ liệu giống như mảng * trừu tượng (như 'std :: vector ') với các toán tử 'overload []' quá tải 'x' và' & x [0] 'sẽ có nghĩa là những thứ rất khác nhau, và * giây * một là cái phù hợp hơn với ý định của tôi. Tất nhiên, tất cả điều này không quan trọng quá nhiều cho đồng bằng C, vì bạn hầu như không có dữ liệu trừu tượng trong C anyway; do đó chính tả với khả năng đọc vượt trội nên được ưu tiên. – ulidtko

Trả lời

12

chúng giống hệt nhau.

someArray[i] 

nghĩa chính xác

*(someArray + i) 

nơi someArray trong trường hợp thứ hai là một con trỏ đến vị trí nhớ. Tương tự như vậy,

&someArray[i] 

nghĩa chính xác

(someArray + i) 

Trong cả hai trường hợp này các từ ngữ là con trỏ đến vị trí nhớ.

12

Cả hai đều tương đương và tôi nghĩ SomeFunction (tmpry); dễ đọc hơn.

1

Cả hai đều giống nhau và mặc dù hình thứ hai trông đẹp và làm rõ ý định truyền mảng tới hàm. Nhưng làm thế nào để các SomeFunction biết kích thước của mảng đang được thông qua, là nó luôn luôn giả định là 40? Tôi cảm thấy tốt hơn là vượt qua kích thước cũng như tham số cho SomeFunction.

+0

Tôi đồng ý, bạn nên vượt qua kích thước cũng như mảng. –

+0

Thậm chí tốt hơn là sử dụng mảng std :: string hoặc boost/tr1 ::. – GManNickG

+0

Tôi đồng ý nếu đó là mã mới, nhưng nếu mã đã được viết thì có thể không thay đổi được datastructures dễ dàng như vậy .. – Naveen

1

Hai biến thể tương đương và đi như thế này

SomeFunction(tmpry); 

trông sạch hơn.

7

thể là đáng kể, nếu SomeFunction là một vĩ mô và mất "sizeof" của một trong những đối số của nó, bởi vì sizeof(tmpry) có thể không nhất thiết phải bằng sizeof(&tmpry[0]).

Nếu không, như những người khác đã chỉ ra, chúng giống hệt nhau.

+0

Trong trường hợp này không có macro liên quan. Tuy nhiên, macro sẽ xử lý chúng khác nhau như thế nào? Macro không hoạt động giống như tìm kiếm chuỗi và thay thế sao cho hàm được tạo ra sẽ tương đương với hàm bình thường? – sipwiz

+0

Kết quả sẽ khác nếu macro lấy sizeof (đối số macro). –

+0

#define Macro (x) RealFunctionCall (x, sizeof (x)) // Ví dụ: – dreamlax

3

Như mọi người khác đã nói, hai ký hiệu là tương đương nhau.

Tôi thường sử dụng một trong những đơn giản hơn, trừ khi có nhiều cuộc gọi như thế này:

SomeFunction(&tmparry[0]); 
SomeFunction(&tmparry[10]); 
SomeFunction(&tmparry[NNN]); 

đâu lý tưởng tất cả các hằng số (con số ma thuật) sẽ là enum (hoặc #define) hằng số.

+0

, thậm chí sau đó, tmparry + 10 tốt hơn & tmparray [10] – hasen

+1

Tôi không đồng ý - nhưng đó là một quyết định chủ quan. –

1

Tuyên bố

int a [10]; int * pa;

Có một sự khác biệt giữa một mảng và một con trỏ phải được lưu ý. Một con trỏ là một biến, vì vậy pa = a và pa ++ là hợp pháp. Nhưng tên mảng không phải là biến; xây dựng giống như một = pa và một ++ là bất hợp pháp

Như các thông số định dạng theo một định nghĩa hàm, char s [] và char * s là tương đương;

Từ:. The C Programming Language 2th, trang 99-100

+0

Để trích dẫn từ trang 99: "Khi một tên mảng được chuyển đến một hàm, những gì được truyền là vị trí của phần tử ban đầu" – David

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