From: Junio C Hamano Date: Mon, 07 Dec 2009 20:07:24 GMT Subject: Re: [RFC PATCH v3 0/8] Remote helpers smart transport extensions Message-ID: <7vein635vn.fsf@alter.siamese.dyndns.org> In-Reply-To: <20091207210608.6117@nanako3.lavabit.com> Nanako Shiraishi writes: > Quoting Junio C Hamano > >> I queued to ease the discussion in 'pu'. I had to fix-up some conflicts >> while doing so. Please sanity check the result. > > I see that you changed many "char* variable" to "char *variable", but > what is the reason for these changes? Nico already gave you correct and more concise version; this more verbose explanation is primarily for you who said a few times that you are not fluent in C. Others can skip this message without missing anything. I haven't asked people why they choose to write like this: char* string; beyond "that is how we were taught and what we are used to". But if I have to guess, it is because it makes it appear as if you are being consistent between basic types like "int" and pointer types like "char *". E.g. these both look like " ;" int variable; char* variable; The example in CodingGuidelines gives a clear illustration that this however is not the way how C language works. IOW, the syntax for declaration is not " , ,...;". E.g. char* var1, var2; declares var1, which is a pointer to a char, and var2, which is a char. That is what Nico means by '* is an attribute of the variable and not of the type'. The only sane way to read declaration in C is to read from inside to outside, starting from a variable name. When you read "char **argv", for example, you treat it as "char (*(*argv))", and read it from the variable name: - It declares argv; what's the type of it I wonder... - It is a pointer, because the asterisk in front of it tells us that we can dereference it. Now, what's the type of the result of dereferencing argv, i.e. "*argv", I wonder... - That "*argv" is a pointer, because the asterisk in front of it again tells us that we can dereference it. Now, what's the type of dereferencing that "*argv", i.e. "**argv", I wonder... - Ah, it is a "char", that is what this declaration says. And the style we use (which is the same as Linux kernel style) naturally matches the way how you read this declaration.