开发者

What does the ** operator mean in C?

开发者 https://www.devze.com 2022-12-22 02:30 出处:网络
Does ** have any special meaning in C? Like this: static intparse_one (int argc, char **argv开发者_运维技巧)

Does ** have any special meaning in C?

Like this:

static intparse_one (int argc, char **argv开发者_运维技巧)
{
    cmd_line       *slot;
    int             value;
    Flag_name       flag_name;
    int         i;

printf("argv %s\n",argv);
printf("argv[0] %c\n",**argv);

If so, does the line

**argv

make sense? A program I am trying to get to run is choking on it. If I try to print it I get a segmentation fault.

The first printf prints the string fine. The second printf fails.

Here is what I am getting for the output (The first line is correct):

argv -aps_instance1001-aps_ato0-aps_ipc_debug3

Segementation Fault (core dumped)


"Does ** have any special meaning in C?"

No, it is just two dereferences.

char **argv

means: argv dereferenced two times is a char. In other words argv is a pointer to a pointer to char.


The same for:

"If so, does the line: **argv make sense?"

The declaration says that **argv is a char. At runtime argv will be dereferenced two times; the value is the char that argv, the pointer to a pointer to char, is pointing to.


** is just two *.

As far as the segfault goes, look at your line printf("argv %s\n",argv);. The printf expects a char *, not char **, and so it's looking at an array of pointers rather than an array of characters. printf is trying to print everything at argv as a string of characters until it encounters a zero, and probably goes out of bounds before it finds one.

argv is a char **, which is a pointer to a pointer, or in this case an array of pointers. Don't print it directly, because it has no external meaning. (You can print the pointer value if you want to see it, of course.)

*argv or argv[0] is a char *, which is a pointer to char, which in this case is the first string in argv.

**argv is a char, which in this case is the first character of the first string in argv.


Yes.

char **argv

is the same thing as

char* argv[]


No.

Every * introduces a level of indirection. In this context, it means that argv is a pointer to a pointer. Which it is not, really, as technically you can see it a an array of pointers - it can be declared as char * argv[].

Obviously, by "no", I mean that ** is not special in itself. Or it is special, but neither more nor less than * or ***.


char **argv is same as char *argv[].

Here argv is the argument vector.


Isn't that a pointer to a pointer? I think the ** in front of the argv parameter has the same effect as ref in C#, in case you know C#.


While the string "**" does have a well defined meaning, I think the answer to the questions is "**" is not one operator, but two "*" in a row.

This is in contrast to Fortran where "**" is a single token and functions as the exponentiation operator.

So the meaning is well covered by Martin Beckett, but it really isn't "an operator".

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号