473,218 Members | 1,475 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,218 software developers and data experts.

incrementing a pointer to an array

The following portion is from c-faq.com - comp.lang.c FAQ list
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip; /* pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
printf("%d\n", **ap);
ap++; /* WRONG */

Here why is incrementing ap ie 'ap++' mentioned as WRONG ? Isn't it
similar to
int i_int = 100;
int *p = &i_int;
p++;

Here we cannot dereference 'p' but incrementing 'p' only once, is
allowed. Similarly,

ap is assigned '&a1'. Then we increment ap only once. Why is this
WRONG ?

Kindly clarify.

Thanks
V.Subramanian
Aug 30 '08 #1
9 3327
su**************@yahoo.com, India said:
The following portion is from c-faq.com - comp.lang.c FAQ list
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip; /* pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
printf("%d\n", **ap);
ap++; /* WRONG */

Here why is incrementing ap ie 'ap++' mentioned as WRONG ?
I'm not sure. I don't know of any reason why it's illegal. Maybe Steve just
means it's a lousy idea.
Isn't it
similar to
int i_int = 100;
int *p = &i_int;
p++;
Yes.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
Aug 30 '08 #2
On Fri, 29 Aug 2008 23:29:22 -0700, su**************@yahoo.com, India
wrote:
The following portion is from c-faq.com - comp.lang.c FAQ list ·
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /*
pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
The trick is here because you are getting the address of the pointer to
the first element, If I am not mistaken...

if you use sizeof on ap you will see that it is associated to the whole
array...8 bytes. Incrementing this address is undefined.

for intel compiler, the fist program prints
0 1
0
40896 <<<
printf("%d\n", **ap);
ap++; /* WRONG */

Here why is incrementing ap ie 'ap++' mentioned as WRONG ? Isn't it
similar to
int i_int = 100;
int *p = &i_int;
p++;

Here we cannot dereference 'p' but incrementing 'p' only once, is
allowed. Similarly,

ap is assigned '&a1'. Then we increment ap only once. Why is this WRONG
?

Kindly clarify.

Thanks
V.Subramanian
Aug 30 '08 #3
utab said:
On Fri, 29 Aug 2008 23:29:22 -0700, su**************@yahoo.com, India
wrote:
>The following portion is from c-faq.com - comp.lang.c FAQ list
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /*
pointer to int */
>int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
The trick is here because you are getting the address of the pointer to
the first element, If I am not mistaken...

if you use sizeof on ap you will see that it is associated to the whole
array...8 bytes.
Wrong. ap is a pointer to the first element of the array, but using sizeof
on ap is by no means required to result in 8, and indeed on my system it
does not. Nor need it result in 3*sizeof(int) - and again, on my system it
does not.

#include <stdio.h>

int main(void)
{
int a1[3] = {0, 1, 2};
int (*ap)[3]; /* pointer to array [3] of int */
ap = &a1;
printf("**ap = %d\n", **ap);
printf("sizeof ap = %d\n", (int)sizeof ap);
ap++;
return 0;
}

**ap = 0
sizeof ap = 4

Incrementing this address is undefined.
Why?

<snip>

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
Aug 30 '08 #4
On Sat, 30 Aug 2008 07:58:05 +0000, Richard Heathfield wrote:
utab said:
>On Fri, 29 Aug 2008 23:29:22 -0700, su**************@yahoo.com, India
wrote:
>>The following portion is from c-faq.com - comp.lang.c FAQ list ·
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /*
pointer to int */
>>int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
The trick is here because you are getting the address of the pointer to
the first element, If I am not mistaken...

if you use sizeof on ap you will see that it is associated to the whole
array...8 bytes.

Wrong. ap is a pointer to the first element of the array, but using
sizeof on ap is by no means required to result in 8, and indeed on my
system it does not. Nor need it result in 3*sizeof(int) - and again, on
my system it does not.

#include <stdio.h>

int main(void)
{
int a1[3] = {0, 1, 2};
int (*ap)[3]; /* pointer to array [3] of int */
Hi,

ap = &a1;

Could you clarify this statement for me? is not ap pointer to whole array
of 3?
printf("**ap = %d\n", **ap);
printf("sizeof ap = %d\n", (int)sizeof ap); ap++;
return 0;
}

**ap = 0
sizeof ap = 4

>Incrementing this address is undefined.

Why?
not incrementing, dereferencing, sorry
>
<snip>
Aug 30 '08 #5
utab said:
On Sat, 30 Aug 2008 07:58:05 +0000, Richard Heathfield wrote:
>utab said:
>>On Fri, 29 Aug 2008 23:29:22 -0700, su**************@yahoo.com, India
wrote:

The following portion is from c-faq.com - comp.lang.c FAQ list
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /*
pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
The trick is here because you are getting the address of the pointer to
the first element, If I am not mistaken...

if you use sizeof on ap you will see that it is associated to the whole
array...8 bytes.

Wrong. ap is a pointer to the first element of the array, but using
sizeof on ap is by no means required to result in 8, and indeed on my
system it does not. Nor need it result in 3*sizeof(int) - and again, on
my system it does not.

#include <stdio.h>

int main(void)
{
int a1[3] = {0, 1, 2};
int (*ap)[3]; /* pointer to array [3] of int */

Hi,

ap = &a1;

Could you clarify this statement for me? is not ap pointer to whole array
of 3?
Yes, ap is a pointer to an array of three ints, and a1 is an array of three
ints, so it's perfectly legal to point ap at a1.
> printf("**ap = %d\n", **ap);
printf("sizeof ap = %d\n", (int)sizeof ap); ap++;
return 0;
}

**ap = 0
sizeof ap = 4

>>Incrementing this address is undefined.

Why?
not incrementing, dereferencing, sorry
Right - but the OP has made it clear that he already knows dereferencing
such a pointer would be illegal. What he's unclear on is why the FAQ says
that incrementing it (just *one* place) is illegal.

Now that I've looked at the FAQ question in question, it seems to me that
this is simply a misunderstanding, and that the FAQ is at fault, but only
mildly so. What Steve is saying is that if your intent is to walk through
the array's objects, getting a pointer to the array isn't the way to do
it. Rather, you get a pointer to the first element in the array, and
increment /that/, in a loop - which is quite right, of course. His WRONG
applies to the error of treating a pointer-to-array as if it were a
pointer-to-first-element-of-array.

--
Richard Heathfield <http://www.cpax.org.uk>
Email: -http://www. +rjh@
Google users: <http://www.cpax.org.uk/prg/writings/googly.php>
"Usenet is a strange place" - dmr 29 July 1999
Aug 30 '08 #6
On Sat, 30 Aug 2008 08:19:07 +0000, Richard Heathfield wrote:
utab said:
>On Sat, 30 Aug 2008 07:58:05 +0000, Richard Heathfield wrote:
>>utab said:

On Fri, 29 Aug 2008 23:29:22 -0700, su**************@yahoo.com, India
wrote:

The following portion is from c-faq.com - comp.lang.c FAQ list ·
Question 6.13
>
int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}}; int *ip; /*
pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\
>
ap = &a1;
The trick is here because you are getting the address of the pointer
to the first element, If I am not mistaken...

if you use sizeof on ap you will see that it is associated to the
whole array...8 bytes.

Wrong. ap is a pointer to the first element of the array, but using
sizeof on ap is by no means required to result in 8, and indeed on my
system it does not. Nor need it result in 3*sizeof(int) - and again,
on my system it does not.

#include <stdio.h>

int main(void)
{
int a1[3] = {0, 1, 2};
int (*ap)[3]; /* pointer to array [3] of int */

Hi,

ap = &a1;

Could you clarify this statement for me? is not ap pointer to whole
array of 3?

Yes, ap is a pointer to an array of three ints, and a1 is an array of
three ints, so it's perfectly legal to point ap at a1.
>> printf("**ap = %d\n", **ap);
printf("sizeof ap = %d\n", (int)sizeof ap); ap++; return 0;
}

**ap = 0
sizeof ap = 4
Incrementing this address is undefined.

Why?
not incrementing, dereferencing, sorry

Right - but the OP has made it clear that he already knows dereferencing
such a pointer would be illegal. What he's unclear on is why the FAQ
says that incrementing it (just *one* place) is illegal.

Now that I've looked at the FAQ question in question, it seems to me
that this is simply a misunderstanding, and that the FAQ is at fault,
but only mildly so. What Steve is saying is that if your intent is to
walk through the array's objects, getting a pointer to the array isn't
the way to do it. Rather, you get a pointer to the first element in the
array, and increment /that/, in a loop - which is quite right, of
course. His WRONG applies to the error of treating a pointer-to-array as
if it were a pointer-to-first-element-of-array.
Right, my English ;) and fast read
Aug 30 '08 #7
In article <2e**********************************@z6g2000pre.g ooglegroups.com>,
su**************@yahoo.com, India <su**************@yahoo.comwrote:
>int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip; /* pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
printf("%d\n", **ap);
ap++; /* WRONG */
>Here why is incrementing ap ie 'ap++' mentioned as WRONG ?
Because the next line, which you have omitted, is

printf("%d\n", **ap); /* undefined */

The increment in isolation is not wrong, but if you're intending to
dereference the pointer, it is.

-- Richard
--
Please remember to mention me / in tapes you leave behind.
Aug 30 '08 #8
su**************@yahoo.com, India wrote:
The following portion is from c-faq.com - comp.lang.c FAQ list ·
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip; /* pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
printf("%d\n", **ap);
ap++; /* WRONG */

Here why is incrementing ap ie 'ap++' mentioned as WRONG ?
compile and run the following. Your implementation will certainly give
different values and perhaps a different format for the addresses. What
will none the less be true is that when ap = &a, ++ap is not the address
of any element of a. Why? Because ap is not a pointer to int, bur a
pointer to an array[3] of int, and the value of ++ap is the address of
the next array[3] of int.

#include <stdio.h>

int main(void)
{
int a[3] = { 0, 1, 2 };
int (*ap)[3]; /* pointer to array [3] of int */
size_t i, n = sizeof a / sizeof *a;
ap = &a;
printf("sizeof a = %zu, sizeof *a = %zu\n", sizeof a, sizeof *a);
for (i = 0; i < n; i++)
printf("&a[%zu] = %p\n", i, (void *) &a[i]);
putchar('\n');
printf("sizeof ap = %zu, sizeof *ap = %zu\n", sizeof ap,
sizeof *ap);
printf("ap = %p, ", (void *) ap);
printf("++ap = %p\n", (void *) ++ap);
return 0;
}
sizeof a = 12, sizeof *a = 4
&a[0] = dff9c
&a[1] = dffa0
&a[2] = dffa4

sizeof ap = 4, sizeof *ap = 12
ap = dff9c, ++ap = dffa8
Aug 30 '08 #9
su**************@yahoo.com, India wrote:
The following portion is from c-faq.com - comp.lang.c FAQ list
Question 6.13

int a1[3] = {0, 1, 2};
int a2[2][3] = {{3, 4, 5}, {6, 7, 8}};
int *ip; /* pointer to int */
int (*ap)[3]; /* pointer to array [3] of int */\

ap = &a1;
printf("%d\n", **ap);
ap++; /* WRONG */

Here why is incrementing ap ie 'ap++' mentioned as WRONG ?
It isn't WRONG taken by itself: It increments `ap'
to point one position past the thing it formerly pointed
at, which was the array `a1'. But it is WRONG when used
in combination with the next line in the FAQ's code, which
you snipped but which I now recommend to you for re-study.

--
Eric Sosman
es*****@ieee-dot-org.invalid
Aug 30 '08 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Mothra | last post by:
Here's what I'm trying to do (kill off old Unix logins): --------------------- $i=0; while (<$who>) { chomp($_); my @line = split(/\s+/, $_); # Split it into an array next unless ($line...
8
by: BigMan | last post by:
I wonder if the C++ standard says what should happen if I increment a pointer to a one-past-the-end value. I think it says that it is perfectly legal to increment a pointer to the last element...
3
by: Bruno van Dooren | last post by:
Hi All, i have some (3) different weird pointer problems that have me stumped. i suspect that the compiler behavior is correct because gcc shows the same results. ...
204
by: Alexei A. Frounze | last post by:
Hi all, I have a question regarding the gcc behavior (gcc version 3.3.4). On the following test program it emits a warning: #include <stdio.h> int aInt2 = {0,1,2,4,9,16}; int aInt3 =...
27
by: Erik de Castro Lopo | last post by:
Hi all, The GNU C compiler allows a void pointer to be incremented and the behaviour is equivalent to incrementing a char pointer. Is this legal C99 or is this a GNU C extention? Thanks in...
53
by: subramanian100in | last post by:
I saw this question from www.brainbench.com void *ptr; myStruct myArray; ptr = myArray; Which of the following is the correct way to increment the variable "ptr"? Choice 1 ptr = ptr +...
7
by: jwhitby3 | last post by:
Hi all, I am trying to develop what amounts to a data entry page for the company I work for, (mostly to make my job easier). I think that I am beginning to grasp php, but I am at a loss now. I...
1
isladogs
by: isladogs | last post by:
The next online meeting of the Access Europe User Group will be on Wednesday 6 Dec 2023 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, Mike...
0
by: veera ravala | last post by:
ServiceNow is a powerful cloud-based platform that offers a wide range of services to help organizations manage their workflows, operations, and IT services more efficiently. At its core, ServiceNow...
0
by: VivesProcSPL | last post by:
Obviously, one of the original purposes of SQL is to make data query processing easy. The language uses many English-like terms and syntax in an effort to make it easy to learn, particularly for...
0
by: jianzs | last post by:
Introduction Cloud-native applications are conventionally identified as those designed and nurtured on cloud infrastructure. Such applications, rooted in cloud technologies, skillfully benefit from...
0
by: abbasky | last post by:
### Vandf component communication method one: data sharing ​ Vandf components can achieve data exchange through data sharing, state sharing, events, and other methods. Vandf's data exchange method...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: fareedcanada | last post by:
Hello I am trying to split number on their count. suppose i have 121314151617 (12cnt) then number should be split like 12,13,14,15,16,17 and if 11314151617 (11cnt) then should be split like...
0
Git
by: egorbl4 | last post by:
Скачал я git, хотел начать настройку, а там вылезло вот это Что это? Что мне с этим делать? ...
1
by: davi5007 | last post by:
Hi, Basically, I am trying to automate a field named TraceabilityNo into a web page from an access form. I've got the serial held in the variable strSearchString. How can I get this into the...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.