What does "void f(int (*)[7]) {}" mean? [duplicate] - c++

This question already has answers here:
what does this mean char (*(*a[4])())[5]?
(4 answers)
Closed 7 years ago.
Can somebody explain what does it mean?
void f(int (*)[7]) {}

There is a site devoted to dealing with C gibberish and converting it to English:
cdecl.org Try it) It is convenient and sometimes even entertaining.
It states that void f(int (*)[7]) means: declare f as function (pointer to array 7 of int) returning void.

This is a function definition, which can accept a pointer to an array of int with 7 size.
Declare an 7-size array, int a[7];, and you can pass the address of it into f, like f(&a);
Check the live: http://cpp.sh/8ztz

It's definition of function that takes one parameter. That parameter is an unnamed pointer to array of ints.

Related

Fixed-size array as function parameter: No matching function for call to 'begin' [duplicate]

This question already has answers here:
Passing an array as a parameter in C
(3 answers)
Passing Arrays to Function in C++
(5 answers)
Closed 8 months ago.
I am passing a fixed size array to a function (the size is defined to a constant in the function's definition). However, I still get the error
No matching function for call to 'begin'
# define arr_size 2
void test(int arr0[2]){
int arr1[]={1,2,3};
int arr2[arr_size];
begin(arr0); // does not work -- how can I make this work?
begin(arr1); // works
begin(arr2); // works
}
There is a related discussion here, however, the array's size was clearly not constant in that case. I want to avoid using vectors (as suggested there) for efficiency reasons.
Does anyone know what the issues is?
This function declaration
void test(int arr0[2]){
is equivalent to
void test(int *arr0){
because the compiler adjusts parameters having array types to pointers to array element types.
That is the both declarations declare the same one function.
You may even write for example
void test(int arr0[2]);
void test(int *arr0){
//,,,
}
So you are trying to call the function begin for a pointer
begin(arr0);
You could declare the parameter as a reference to the array type
void test(int ( &arr0 )[2]){
to suppress the implicit conversion from an array to a pointer.

Size control on passing array to function [duplicate]

This question already has answers here:
Why does argument matching in C++ ignore array sizes?
(1 answer)
In a function declaration, what does passing a fixed size array signify? [duplicate]
(3 answers)
Why can one specify the size of an array in a function parameter?
(3 answers)
Closed 3 years ago.
In C++, arrays are supposed to be passed to functions by reference. Hence, in what follows, function foo should implicitly use array inp by reference.
void foo(double inp[10]) {}
void foo1(double (&inp)[10]) {}
My question is, since both functions supposedly have the same interpretation of the input variable, why can we call foo in what follows, but we cannot call foo1?
int main()
{
double ary[20];
foo(ary); // compiles without any problem.
foo1(ary); // compiler error: invalid initialization of reference of type ‘double (&)[10]’ from expression of type ‘double [20]’
return 0;
}
since both functions supposedly have the same interpretation of the input variable
But they don't. A function argument of the type double inp[10] is automatically adjusted to a pointer double*. The 10 plays no part in providing type information here. Since all arrays decay to pointers, that will allow you to pass an array of any size.
A reference to an array does not get adjusted however. The type information is still there, and it must be a reference to an array of exactly ten doubles. The only way to pass a reference to an array of any size is to have a separate function for it, which you may write a function template to accomplish
template<std::size_t N>
void foo2(double (&inp)[N]) {}

C++ what is the difference of type * and type *& in function [duplicate]

This question already has answers here:
Passing references to pointers in C++
(10 answers)
Closed 4 years ago.
I have two function signatures in C++
void printArray(int* arrayPtr);
void printArray(int*& arrayPtr);
I understand the 1st function. It says the function takes in a arrayPtr argument which is of type that's a pointer pointing to an integer.
Both function signature works, but I have a hard time understanding the 2nd signature(*&) and what benefits it offers?
It's exactly the same as type versus type&; the first is a value and the second is a reference. The fact that type is a pointer doesn't change that.

Passing function (without pointer) as argument to another function [duplicate]

This question already has answers here:
Why do function pointer definitions work with any number of ampersands '&' or asterisks '*'?
(5 answers)
How do function pointers in C work?
(12 answers)
Closed 4 years ago.
I'd like to know what is the difference between these two (seemingly correct) ways of passing a function to another function:
void fun(int p(int x));
void fun(int (*p)(int x));
Also, I know that in the second case we're passing a function pointer, but is the first approach also a function pointer (but without the star)?

What is the syntax in this typedef statement doing? [duplicate]

This question already has answers here:
Typedef function pointer?
(6 answers)
Closed 6 years ago.
I ran across a line of code that looks like the following:
typedef Foo* (*CREATE_BAR)(uint32_t);
How exactly does this work? What is happening in this code?
It's a function pointer type named CREATE_BAR which accepts a uint32_t argument and returns a Foo*. It could hold a pointer to any such function.
It is a type for a pointer on function returning Foo*, and taking uint32_t
In c++11, it would be
using CREATE_BAR = Foo* (*)(uint32_t);