Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中,一个指针可以指向多个指针吗?_C_Pointers_Debugging_Unix - Fatal编程技术网

在C语言中,一个指针可以指向多个指针吗?

在C语言中,一个指针可以指向多个指针吗?,c,pointers,debugging,unix,C,Pointers,Debugging,Unix,我们可以通过写入int*来声明指向整数的指针。我们已经看到一个指针类型char**argv。这是指向字符指针的指针 似乎argv是指向指向字符的多个指针的指针 在C语言中,字符串由指针类型char*表示。在引擎盖下,它们存储为字符列表,其中最后一个字符是称为空终止符的特殊字符 上述字符**中指针是否以字符形式存储在字符串中?是 指向类型T的指针p可以指向单个T,也可以指向T的数组。在后一种情况下,您可以使用指针算法(如p[n])索引到数组中。同样地,argv[n]的指针对象不是单个的chars,

我们可以通过写入int*来声明指向整数的指针。我们已经看到一个指针类型char**argv。这是指向字符指针的指针

似乎argv是指向指向字符的多个指针的指针

在C语言中,字符串由指针类型char*表示。在引擎盖下,它们存储为字符列表,其中最后一个字符是称为空终止符的特殊字符

上述字符**中指针是否以字符形式存储在字符串中?


指向类型
T
的指针
p
可以指向单个
T
,也可以指向
T
的数组。在后一种情况下,您可以使用指针算法(如
p[n]
)索引到数组中。同样地,
argv[n]
的指针对象不是单个的
char
s,而是以nul结尾的
char
s数组,也称为C样式字符串。

指针可以指向单个对象,也可以指向对象数组

对于声明为
char*argv[]
(或等效为
char**
,因为它是一个函数参数)的
argv
参数到
main
,它是指向
char*
数组的指针

在内存中,它看起来像这样:

argv
-----
| .-|---->  ------
-----       |    |       ----------------------------------
            |  .-|-----> | s | t | r | i | n | g | 1 | \0 |
            |    |       ----------------------------------
            ------
            |    |       ----------------------------------
            |  .-|-----> | s | t | r | i | n | g | 2 | \0 |
            |    |       ----------------------------------
            ------
            |    |       ----------------------------------
            |  .-|-----> | s | t | r | i | n | g | 3 | \0 |
            |    |       ----------------------------------
            ------
            ...

指针是对内存地址的引用-指针包含一个变量的地址。指向指针的指针是一种间接寻址形式,其中指针包含指向另一个指针变量的地址。第二个指针变量包含存储值的地址


argv是指参数向量,它引用通过命令行传递给程序的参数。指针argv指向字符数组中的第一个元素;现在,由于向量表示为数组,它隐式地查找其他指针。

当我们定义一个
char*argv[]
时,例如:

示例1:

char *p[5] = {{"ali"}, {"reza"}, {"hamid"}, {"saeed"}, {"mohsen"}};

for(int i = 0;i < 5;i++)
    printf("%s\n", *p[i]);
这在内存中发生:

内存地址:| 0xA0 | 0xA1 | 0xA2 | 0xA3 | 0xA4 | 0xA5 | 0xA6 | 0xA7|
内存内容:| 0x123 | 0x456|
|-------4字节------|

|你到底在问什么还不完全清楚。完全不清楚。问题是什么?这个问题对我来说很清楚。不知道还有什么好说的。你熟悉数组吗?因为你应该从数组而不是字符串的角度来考虑,因为字符串并不是C语言中真正存在的东西,而是一个
char
数组,一些函数用一种特殊的方式处理它,使之像字符串一样。因此,不是你持有一个指针字符串,而是一个指针数组,就像字符串实际上是一个字符数组,但对空终止符有特殊意义。
char **p;
p = new char*[5];

for(int i = 0;i < 5;i++)
    p[i] = new char[10];
Memory-Address:  |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content:  |        0x123      |       0x456       |
                 |-------4-Byte------|
                 |<- int* = 0x123
Memory-Address:  |0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xA6|0xA7|
Memory-Content:  |        0xA4       |        0x123      |
                 |-------4-Byte------|
                 |<- int** = 0xA4    |<- int* = 0x123