Pointer Artimetic Gets Compiler Warning Posted by spflanze on 2015-12-16 02:18 The code: int testar[] = {1,2,3}; int * ptestar; ptestar = &testar+1; int testar[] = {1,2,3};int * ptestar;ptestar = &testar+1; Gets on its last line the warning: assignment from incompatible pointer typexxxxxxxxxx assignment from incompatible pointer type Why would this pointer arithmetic cause this error? What is the right way to do this?
Posted by bugmenot on 2015-12-16 16:48 &testar is of **int type. Try this: int testar[] = {1,2,3}; int * ptestar; ptestar = testar+1; P.S. You can expect quick answers with this type of questions (C language question unrelated to the IDE or STM32) in other general C programming forums.
Posted by spflanze on 2015-12-16 18:17 ptestar = testar+1;xxxxxxxxxx ptestar = testar+1; is not equivalent to ptestar = &testar+1;xxxxxxxxxx ptestar = &testar+1; The former is the same as ptestar = &testar[1];xxxxxxxxxx ptestar = &testar[1]; This is not what I am seeking to do, which is to get a pointer to a location just beyond the bounds of the array to find the array size by the method I describe in this thread: http://www.openstm32.org/tiki-view_forum_thread.php?forumId=7&comments_parentId=1612 I have given up on that method. I realize now there is no advantage to doing it that way over the use of the sizeof operator.
Posted by dautrevaux on 2015-12-16 19:08 Hi, If you want to have the address after the testar array you must declare ptestar as a pointer to a pointer to int (as it is really the address of an array of 3 ints...):int **ptestar = &testar+1;xxxxxxxxxx int **ptestar = &testar+1;However, there is two things to note about your code: If you follow strictly the C standard, your C program is not standard compliant, as pointer arithmetic is restricted to stay inside a single C object, while you code use pointer arithmetic to point to a integer array located after the testar object If you want to be clearer that what follows testar is not another integer array, you may devlare ptestar as a pointer to void:void *ptestar = &testar+1;xxxxxxxxxx void *ptestar = &testar+1; Obviously, the testar declaration must be an array definition that provides the compiler with the size of the array; it cannot be an external declaration of a variable size array as, in this case, the compiler will not have any way, at compile time, to know the size of the array: it will only be known at link time, too late for the compiler to use it. Hope this helps, Bernard (Ac6)