osd7@homxa.UUCP (Orlando Sotomayor-Diaz) (05/11/85)
From: Orlando Sotomayor-Diaz (The Moderator) <cbosgd!std-c> mod.std.c Digest Sat, 11 May 85 Volume 6 : Issue 7 Today's Topics: Pointer arithmetic and function pointers (4 msgs) ---------------------------------------------------------------------- Date: Fri, 10 May 85 10:28:01 pdt From: John Bruner <seismo!mordor!jdb> Subject: Pointer arithmetic and function pointers To: std-c@cbosgd > No! No! No! What about the following (which is legal and works): > > int (*afp[])(); > > This is an array of pointers to functions. All arrays in C can be > used as xxx[n] or *(xxx+n); more explicitly, an array name is actually > the address of the first element of the array and is a constant (which > is why an array name cannot be an lvalue). Put this all together and > you get that arithmetic on a pointer-to-function is a necessary thing. Given the array of pointers to functions int (*afp[])(); the semantically equivalent expressions afp[n] *(afp+n) (where "n" is an integer expression) are not performing arithmetic on pointers to functions. The arithmetic is performed on a pointer to a pointer to function. The type of "afp" in an expression (except sizeof) is (int (**)()) [C.2.2.1]. The integer expression is scaled by "sizeof (int (*)())", making this equivalent to (int (*)()) ( (unsigned long)afp + n*sizeof(int (*)()) ) -- John Bruner (S-1 Project, Lawrence Livermore National Laboratory) MILNET: jdb@mordor.ARPA [jdb@s1-c] (415) 422-0758 UUCP: ...!ucbvax!dual!mordor!jdb ...!decvax!decwrl!mordor!jdb ------------------------------ Date: Fri, 10 May 85 14:39:38 edt From: Alex Dupuy <seismo!columbia!dupuy> Subject: Pointer arithmetic and function pointers To: std-c@cbosgd >>Since the size of a function object is not defined, I believe this >>should be amended to disallow expressions which combine integers and >>pointers to functions: >> >> foo + 1 /* illegal */ > >No! No! No! What about the following (which is legal and works): > > int (*afp[])(); > >This is an array of pointers to functions. ----------- Exactly. Since it is an array of function -pointers-, when you do something like *afp[1] (arg); or equivalently, *(*(afp+1)) (arg); you're adding 1 to a (constant) pointer to a -pointer to a function-. Though "sizeof int()" is undefined, "sizeof int *()" is defined, usually the same as sizeof(*int). Since the first message doesn't say anything about pointers to pointers to functions, your construct is perfectly legal. The twisted nature of C type declarations and the array/pointer distinction make this a confusing problem, but there is no reason to allow adding integers to function pointers, except that it might cause others to make the same mistake as you. One could make a case for multiple entry points to a function, though; allowing you to add a -label- to a function, but this is an extension to C which doesn't really belong in the standard. @alex ------------------------------ Date: 10 May 85 13:19:28 CDT (Fri) From: ihnp4!bbncca!keesan Subject: Pointer arithmetic and function pointers To: ihnp4!cbosgd!std-c, ihnp4!nbires!gangue!obo586!dir Arithmetic on pointers to pointers is fine, but I agree with the original poster that arithmetic on pointers to functions should be explicitly prohibited. Morris M. Keesan {decvax,linus,ihnp4,wanginst,wjh12,ima}!bbncca!keesan keesan @ BBN-UNIX.ARPA ------------------------------ Date: Fri, 10 May 85 13:07:06 CDT From: William LeFebvre <ucbvax!phil@rice.ARPA> Subject: Pointer arithmetic and function pointers To: cbosgd!nbires!gangue!obo586!dir@BERKELEY I agree with the original posting: arithmetic on a pointer-to-function makes no sense. William LeFebvre Department of Computer Science Rice University <phil@Rice.arpa> ------------------------------ End of mod.std.c Digest - Sat, 11 May 85 10:50:39 EDT ****************************** USENET -> posting only through cbosgd!std-c. ARPA -> ... through cbosgd!std-c@BERKELEY.ARPA (NOT to INFO-C) In all cases, you may also reply to the author(s) above.