8

Tôi có một hàm chấp nhận một mảng nguyên làm đối số và in nó.Truyền các giá trị trực tiếp dưới dạng mảng để hoạt động trong C

void printArray(int arr[3]) 
{ 
    int i; 
    for(i=0; i<3; ++i) 
    { 
     printf("\n%d", arr[i]); 
    } 
} 

Có cách nào để vượt qua các giá trị của mảng như thế này

printArray({3, 4, 5}); 

nếu tôi biết các giá trị trước mặt mà không cần phải tạo ra một mảng chỉ vì lợi ích của đi qua nó để các chức năng?

+0

Nếu bạn cần vượt qua một mảng, bạn cần phải có một mảng. – alk

+1

chỉ để sửa đổi những gì @alk đã nói, ... chỉ chúng tôi mới có thể quyết định/kiểm soát xem đó là tên được đặt tên hoặc chưa đặt tên. nhưng __it__ phải ở đó. –

Trả lời

8

TL; DR Các hàm mong đợi một (trỏ đến) một mảng làm đối số đầu vào, vì vậy bạn phải chuyển một đối số. Bạn không thể gọi số này là nếu không có một mảng.

Điều đó nói rằng, nếu bạn muốn yêu cầu "mà không tạo biến mảng bổ sung", điều đó chắc chắn có thể xảy ra. Bạn có thể đạt được điều đó bằng cách sử dụng tên gọi là compound literal. Một cái gì đó như:

printArr((int []){3, 4, 5}); 

sẽ hoạt động tốt.

Để báo C11, chương §6.5.2.5

[TrongC99, chương §6.5.2.5/p4]

Một biểu thức postfix bao gồm một loại tên trong ngoặc đơn sau bởi một danh sách cú pháp kèm theo của các bộ khởi tạo là một chữ ghép. Nó cung cấp một đối tượng chưa đặt tên có giá trị được đưa ra bởi danh sách khởi tạo.

Điều đó nói rằng, printArr()printArray() không giống nhau, nhưng tôi tin đó chỉ là lỗi đánh máy trong đoạn mã của bạn.

+2

Không biết rằng .. C11 có các tính năng thú vị ... được biên dịch tốt với 'gcc' –

+0

thực hiện việc biên dịch này? – artm

+0

@artm Ye, tôi nghĩ vậy. Bạn đã nhận được một thất bại? Tôi quan tâm. –

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