Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | 88888 Dihedral <dihedral88888@googlemail.com> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: 2D arrays, pointers, and pointer arithmetic: question |
| Date | 2012-08-24 11:10 -0700 |
| Organization | http://groups.google.com |
| Message-ID | <179c8d68-2724-4cc5-90fc-e97cfc3eee97@googlegroups.com> (permalink) |
| References | <e03d454c-bb78-4a20-be1a-9d082c7e1748@googlegroups.com> <5037A576.6020506@verizon.net> |
James Kuyper於 2012年8月25日星期六UTC+8上午12時01分58秒寫道: > On 08/24/2012 11:28 AM, gdotone@gmail.com wrote: > > > I'm reading "A Book on C", 4th edition. The author gives the following example when discussing two dimensional arrays: > > > > > > a[3][5], so let a[][] be of type int. > > > > > > > > > col 1 col 2 col 3 col 4 col 5 > > > row 1 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] > > > row 2 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] > > > row 3 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] > > > > > > The author then says that the following expression are equivalent > > > > > > a[i][j] > > > *(a[i] + j) > > > (*(a + i))[j] > > > *((*(a+i)) + j) > > > *(&a[0][0] + 5*i + j) > > > > <pedantic> > > This last expression takes a pointer to the first element of an array > > containing only 5 elements, and (for i > 0) attempts to dereference it > > after adding an integer greater than or equal to 5. Such derefencing has > > undefined behavior (6.5.6p8). This interpretation of the standard is > > controversial, but IMNSHO correct. In practice, on many machines it will > > work exactly as expected. It's unlikely to fail except on systems which > > provide run-time array bounds checking, which is rare. > > > > Otherwise, the only way it's likely to fail is if the optimizer takes > > advantage of the fact that it has undefined behavior by performing > > optimizations that depend upon such code not being executed. For > > instance, an implementation that performs an optimization based upon the > > assumption that a[0]+i never refers to the same object a[1]+j, > > regardless of the values of i and j, is perfectly legal despite the fact > > that such an optimization could break code like this. > > </pedantic> > > > > > I understand that the table is just a convenient representation of the 2D array. > > > In memory the 2D array is actually contiguous. OK. > > > > > > My question has to do with saying or writing out in words what is being shown when using the *, dereferencing, and &, address operators. > > > > > > Is this the correct way of saying: > > > > > > *(a[i] + j) the base address is pointed to by a[i] and we move along the contiguous memory j (interval), so we add j, j of size int, to get the value at that location we use the dereference operator. > > > > > > I believe I understand what's happening, but am I saying it right. > > > > Not quite, a[i] doesn't point at the base address. a[i] is an expression > > of array type, and in most contexts (this being one of them) gets > > automatically converted to a pointer (address) to the first element of > > the array. > > > > > (*(a + i))[j] the base address is at a, i is added to the base address, ok, I understand that we are looking at the row location here, but I'm stuck at how to say this. > > > > a is an expression of array type, which automatically gets converted > > into a pointer to the first element of that array, a[0]. Adding 'i' to > > that pointer gives the address of the 'i+1'th element of that array, > > a[i]. Dereferencing that pointer gives an expression of array type, > > referring to a[i]. Like all such expressions, in most contexts, it gets > > automatically converted to a pointer to the first element of that array > > a[i][0]. Whenever x[j] is a valid expression, it is equivalent to > > *(x+j). Adding 'j' to that pointer gives a pointer to the 'j+1'th > > element of a[i], which is a[i][j]. Dereferencing that pointer gives the > > value of that element. > > > > > let's say addresses are given in decimal, an integer in one byte and each address points to a byte. I hope I'm saying this right? > > > at address 100, a[0][0] > > > at address 109, a[1][0] > > > (if this thought is wrong please clear this up) > > > > a[1][0] is stored at a position that is exactly 5*sizeof a[0][0] bytes > > after the position of a[0][0]. Therefore, assuming a linear address > > space (which C does NOT require), the difference in the addresses must > > be an exact multiple of 5. 109-100=9 doesn't qualify. > > > > > let's also say we are starting at location 100 (decimal). > > > consider a[1][0]. row 2, col 1 for the following discussion please. > > > > > > (*(a + i ))[j] --- (*(a + 1))[0] > > > so, a, the start of the array is pointing to location 100 > > > What does it mean to add 1 to a? > > > > a + 1 => &a[0] + 1 => &a[1]. In summary one should view int ** a, and int *a2[4000], and int a3[4000][4000] differently. The last one has been very easy to be used in the unix or linux systems long time ago.
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
2D arrays, pointers, and pointer arithmetic: question gdotone@gmail.com - 2012-08-24 08:28 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Adrian Ratnapala <adrian.ratnapala@gmail.com> - 2012-08-24 08:41 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-24 12:01 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question 88888 Dihedral <dihedral88888@googlemail.com> - 2012-08-24 11:10 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question gdotone@gmail.com - 2012-08-27 13:35 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-27 16:46 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question Adrian Ratnapala <raka@scooter.fritz.box> - 2012-08-28 19:06 +0000
Re: 2D arrays, pointers, and pointer arithmetic: question Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-08-28 15:22 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-28 15:34 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question Keith Thompson <kst-u@mib.org> - 2012-08-28 14:11 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-28 17:26 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question "io_x" <a@b.c.invalid> - 2012-08-29 09:25 +0200
Re: 2D arrays, pointers, and pointer arithmetic: question Adrian Ratnapala <raka@scooter.fritz.box> - 2012-08-29 07:20 +0000
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-29 07:17 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question Adrian Ratnapala <raka@scooter.fritz.box> - 2012-08-29 11:41 +0000
Re: 2D arrays, pointers, and pointer arithmetic: question Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-08-29 08:21 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question Keith Thompson <kst-u@mib.org> - 2012-08-29 11:37 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Edward Rutherford <edward.p.rutherford79@REMOVETHIS.gmail.com> - 2012-08-29 20:05 +0000
Re: 2D arrays, pointers, and pointer arithmetic: question James Kuyper <jameskuyper@verizon.net> - 2012-08-29 17:27 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question Keith Thompson <kst-u@mib.org> - 2012-08-29 18:05 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Les Cargill <lcargill99@comcast.com> - 2012-08-29 20:14 -0500
Re: 2D arrays, pointers, and pointer arithmetic: question Malcolm McLean <malcolm.mclean5@btinternet.com> - 2012-08-30 04:47 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Richard Damon <news.x.richarddamon@xoxy.net> - 2012-09-01 23:47 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question 88888 Dihedral <dihedral88888@googlemail.com> - 2012-09-02 04:43 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Richard Damon <news.x.richarddamon@xoxy.net> - 2012-09-02 23:12 -0400
Re: 2D arrays, pointers, and pointer arithmetic: question ais523 <ais523@nethack4.org> - 2012-08-30 11:35 +0000
Re: 2D arrays, pointers, and pointer arithmetic: question ralph <nt_consulting64@yahoo.com> - 2012-08-30 11:17 -0500
Re: 2D arrays, pointers, and pointer arithmetic: question Keith Thompson <kst-u@mib.org> - 2012-08-30 13:52 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Anders Wegge Keller <wegge@wegge.dk> - 2012-08-30 23:13 +0200
Re: 2D arrays, pointers, and pointer arithmetic: question ralph <nt_consulting64@yahoo.com> - 2012-08-31 16:37 -0500
Re: 2D arrays, pointers, and pointer arithmetic: question Barry Schwarz <schwarzb@dqel.com> - 2012-08-27 19:45 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Keith Thompson <kst-u@mib.org> - 2012-08-27 20:40 -0700
Re: 2D arrays, pointers, and pointer arithmetic: question Tim Rentsch <txr@alumni.caltech.edu> - 2012-09-07 06:28 -0700
csiph-web