怎么了?我不明白这个问题... ... 我知道一个数组的第一个元素是整个数组的地址。但在这种情况下,我无法理解。
#include <stdio.h>
int main(int ac, char **av)
{
printf("&av[1]= %p\n", &av[1]);
printf("&av[1][0]= %p\n", &av[1][0]);
return(0);
}
输入内容
./a.out "Hello"
产量
&av[1]= 0x7ffee0ffe4f0
&av[1][0]= 0x7ffee0ffe778
如果有人告诉你 char **av
申报一个二维数组,他们对你很不利。在 char **av
, av
是一个指向 char *
,可能是第一个 char *
的几个。所以 av[1]
是一个 char *
-它是一个 指针 到 char
和 &av[1]
是 该指针的地址.
av[1][0]
是 char
该 av[1]
指的是,和 &av[1][0]
是该地址的 char
.
指针指向 char
和 char
当然是不在同一个地方,所以。&av[1]
和 &av[1][0]
是不同的。
相反,如果你有一个数组,如 char av[3][4]
那么 av
是一个由3个数组组成的4个数组。char
. 在这种情况下: av[1]
是一个4的数组 char
和 &av[1]
将是该数组的地址(开始)。&av[1][0]
将是该数组中第一个 char
在该数组中。由于 char
是在数组的开头,数组的地址和在数组中的 char
是一样的。
(然而,在C语言的实现中,它们的表示方式不一定相同,用 %p
可以显示不同的结果,即使它们指向内存中的同一个地方。)
av
在这里不是一个二维数组。它是一个指针数组。
而对于二维数组来说。&av[1][0]
将有相同的地址 &av[1]
;在一个指针数组中。&av[1][0]
意思是取第二个(index=1)指针,对其进行去引用,并给我去引用指针目标指向的第一个元素的地址(目标的目标是 av[1]
也是一个指针)。)
&av[1]
是第二个 char*
, &av[1][0]
是第二个字符的地址。char*
点在。不同的东西。
av
是一个指针数组,这个数组的每个元素都指向一个 char array
者 char *
),其中存储了你作为程序输入的每个字符。
正如你可以通过下面的程序变化看到的。av[0]
储存的地址是 av[0][0]
(即指向存储在该字符串的第一个位置的 av[0][0]
),其中包含字符 .
和 av[1]
储存的地址是 av[1][0]
(即指向存储在该字符串的第一个位置的 av[1][0]
),其中包含字符 H
.
#include <stdio.h>
int main(int ac, char **av)
{
printf("&av[0]= %p\n", &av[0]);
printf("&av[1]= %p\n", &av[1]);
printf("av[0]= %p\n", av[0]);
printf("av[1]= %p\n", av[1]);
printf("av[0][0]= %c\n", av[0][0]);
printf("av[0][1]= %c\n", av[0][1]);
printf("av[0][0]= %p\n", &av[0][0]);
printf("av[0][1]= %p\n", &av[0][1]);
printf("av[1][0]= %c\n", av[1][0]);
printf("av[1][1]= %c\n", av[1][1]);
printf("av[1][0]= %p\n", &av[1][0]);
printf("av[1][1]= %p\n", &av[1][1]);
return(0);
}
它提供了以下输出。
$ ./a.out "Hello"
&av[0]= 0x7fff53625cf8
&av[1]= 0x7fff53625d00
av[0]= 0x7fff53626ee9
av[1]= 0x7fff53626ef1
av[0][0]= .
av[0][1]= /
&av[0][0]= 0x7fff53626ee9
&av[0][1]= 0x7fff53626eea
av[1][0]= H
av[1][1]= e
&av[1][0]= 0x7fff53626ef1
&av[1][1]= 0x7fff53626ef2
图形上是这样的(为了简化,删除了大部分地址)。
av: | 26ee9 | 26ef1 |
| |
av[0] av[1]
address: 25cf8 25d00
av[0]: | . | / | ...
| |
av[0][0] av[0][1]
address: 26ee9 26eea
av[1]: | H | e | ...
| |
av[1][0] av[1][1]
address: 26ef1 26ef2
我希望这能澄清你的疑问.
av
是一个指向数组指针的指针,指向 char
s. 所以它的第二个元素(数组的第二个元素),确实是一个指针。 &av[1]
是它的地址(指针的地址,不是字符的地址)。
在另一个方面。av[1][0]
是这第二个字符串的第一个字符。 它的地址是一个 char
地址,第一个字符就存放在这里。
这两个地址都是不同事物的地址,所以它们指向不同的地方很正常。
av[1]
和 &av[1][0]
分别是指针值(指向第一个char)和第二个字符串的第一个char的地址,所以 它们必须是显示相同值的指针. 同样的情况发生在 *av[1]
和 av[1][0]
它们代表着相同的指向性字符。