I know this isn't a Keil specific question, but I know you guys are smart and that I'll just get a direct non-mocking answer.
Is it legal to take the address of a function argument?
void Bar(unsigned char *Pointer) { // Access data byte via the pointer } int Foo(unsigned char Arg) { Bar(&Foo); // <<<<<< Is this legal? }
I know you cannot take the address of a variable of type register and I think that knowledge is clouding my memory.
The first function takes a pointer - so you already got the address of the buffer where you are expected to store the answer.
The second function takes an int - that is a local copy so you may take the address of this local variable Arg but can't return back a change.
But note that your code didn't take the address of an argument but instead tried to get the address of the function itself - and you shouldn't use any & to get the address of a function. The function name itself represents the pointer to that function.
The following will use a function pointer:
void Bar(int (*fnk)(unsigned char)) { fnk('A'); } int Foo(unsigned char Arg){ return Arg + 1; } void main() { Bar(Foo); while (1) ; }
And this code actually uses the address of a parameter:
void Bar(unsigned char *Pointer) { // Access data byte via the pointer *Pointer = *Pointer + 1; } int Foo(unsigned char Arg) { Bar(&Arg); // Let Bar() play with our Arg and modify it. return Arg; }
"But note that your code didn't take the address of an argument but instead tried to get the address of the function itself - and you shouldn't use any & to get the address of a function. The function name itself represents the pointer to that function."
Per, it does not matter whether you use & or not. You will still get the address of the function. In fact many quality analysis tools (e.g. QAC) recommend that you do use the & for clarity.
Yes, I know you can use & - but I don't like it. Some compilers will also emit a warning if & is used.
And I'm not too fond of code analyzer tools that prefers the address-of operator for function pointers.
Using & with arrays specifically means the address of the full array instead of the address of the first element, so there is a different type involved.
Anyway - lots can be said about function pointers and this is an interesting article: stackoverflow.com/.../why-do-all-these-crazy-function-pointer-definitions-all-work-what-is-really-goi
View all questions in Keil forum