From: Mike Pastore <mike@oobak.org>
To: km <km@mrna.tn.nic.in>
Cc: linux-c-programming@vger.kernel.org
Subject: Re: pointer notation
Date: Tue, 28 Oct 2003 18:40:50 +0000 [thread overview]
Message-ID: <1067366450.27155.13.camel@rythm.oobak.org> (raw)
In-Reply-To: <20031028174605.GA5517@mrna.tn.nic.in>
Quite simply, s is a pointer to a pointer to a struct. You want to
dereference it once (with a prefix "*") before dereferencing it a second
time (with an infix "->"). Maybe the following pseudo-equivalent code
will help you understand:
struct node **s, *t; /* introduce temporary "t" */
t = *s; /* dereference s, store result in t */
t->previous = NULL; /* set member of t (*s) to NULL */
The infix "->" binds tighter (has a higher precedence) than the prefix
"*". The incorrect statement "*s->previous = NULL;" is therefore
equivalent to "*(s->previous) = NULL;" and will attempt to get the
"previous" member of s and then dereference the result. But s has no
previous member! It is a pointer to a pointer to a struct, NOT a pointer
to a struct!
The use of parenthesis in "(*s)->previous = NULL;" establishes a clear
order of operations (dereference and THEN get member), which a couple
folks have already mentioned.
--
Mike Pastore
mike@oobak.org
On Tue, 2003-10-28 at 17:46, km wrote:
> Hi all,
> i should have posted the snippet before itself to be clear, which i am doing now.
>
> It is from a double-linked list snippet as follows :
> ----------------CODE START---------------------------------------
> #include<stdio.h>
> #include<stdlib.h>
> struct node
> {
> int content;
> struct node *next;
> struct node *previous;
> };
> /* prototype declaration */
> void add(struct node **s,int c);
> /*main program*/
> int main()
> {
> struct node *p;
> p = NULL;
> add(&p,21);
> return 0;
> }
>
> /* function */
> void add(struct node **s,int c)
> {
> struct node *r,*q=*s;
>
> if(*s==NULL)
> {
> *s = (struct node *)malloc(sizeof(struct node));
> (*s)->previous = NULL; /* (*s) ??? whats that ? */
> (*s)->next = NULL;
> (*s)->content = c
> }
> else
> {
> /*bla bla*/
> }
> }
> ----------------CODE END-------------------------------------
> In the above code we can see the statement called "(*s)->previous = NULL;". I didnt get what exactly it means to be and how different is *s different from (*s) in this context. can it be written in any other form alternatively ?
> thanks for the feedback,
> regards,
> KM
>
>
> -----------------------------------------------------------------
> On Tue, Oct 28, 2003 at 10:00:01AM -0200, Luciano Moreira - igLnx wrote:
> > Try to think that p is a MACRO, like as (arbitrary macro):
> > "#define p pBaseList+5*(x->element)+1"
> >
> > When you do:
> > "p->next"
> > it ll be:
> > "pBaseList+5*(x->element)+1->next"
> >
> > the code above seems to be unsafe, so, if you do:
> > "(p)->next"
> > or:
> > "#define p (pBaseList+5*(x->element)+1)"
> > it ll free or code of "precedence bugs".
> >
> > Luciano
> >
> > km wrote, On 28/10/2003 07:42:
> >
> > >Hi all,
> > >how different is the notation
> > >(p)->next (what do the parenthesis around the pointer signify ? )
> > >different from
> > >p ( while p is a pointer)
> > >
> > >regards,
> > >KM
> > >
> > >-
> > >To unsubscribe from this list: send the line "unsubscribe
> > >linux-c-programming" in
> > >the body of a message to majordomo@vger.kernel.org
> > >More majordomo info at http://vger.kernel.org/majordomo-info.html
> > >
> > >
> > >
> > >
> >
> > -
> > To unsubscribe from this list: send the line "unsubscribe
> > linux-c-programming" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2003-10-28 18:40 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-10-28 9:42 pointer notation km
2003-10-28 10:17 ` Thomas Steudten
2003-10-28 12:00 ` Luciano Moreira - igLnx
2003-10-28 17:46 ` km
2003-10-28 18:40 ` Mike Pastore [this message]
2003-10-28 18:46 ` Jeff Woods
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1067366450.27155.13.camel@rythm.oobak.org \
--to=mike@oobak.org \
--cc=km@mrna.tn.nic.in \
--cc=linux-c-programming@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).