av[1]和av[1][0]不是同一个地址?

问题描述 投票:1回答:1

怎么了?我不明白这个问题... ... 我知道一个数组的第一个元素是整个数组的地址。但在这种情况下,我无法理解。

#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
c arrays pointers memory-address argv
1个回答
2
投票

如果有人告诉你 char **av 申报一个二维数组,他们对你很不利。在 char **av, av 是一个指向 char *,可能是第一个 char * 的几个。所以 av[1] 是一个 char *-它是一个 指针char&av[1]该指针的地址.

av[1][0]charav[1] 指的是,和 &av[1][0] 是该地址的 char.

指针指向 charchar 当然是不在同一个地方,所以。&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 可以显示不同的结果,即使它们指向内存中的同一个地方。)


1
投票

av 在这里不是一个二维数组。它是一个指针数组。

而对于二维数组来说。&av[1][0] 将有相同的地址 &av[1];在一个指针数组中。&av[1][0] 意思是取第二个(index=1)指针,对其进行去引用,并给我去引用指针目标指向的第一个元素的地址(目标的目标是 av[1] 也是一个指针)。)

&av[1] 是第二个 char*, &av[1][0] 是第二个字符的地址。char* 点在。不同的东西。


1
投票

av 是一个指针数组,这个数组的每个元素都指向一个 char arraychar *),其中存储了你作为程序输入的每个字符。

正如你可以通过下面的程序变化看到的。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

我希望这能澄清你的疑问.


1
投票

av 是一个指向数组指针的指针,指向 chars. 所以它的第二个元素(数组的第二个元素),确实是一个指针。 &av[1] 是它的地址(指针的地址,不是字符的地址)。

在另一个方面。av[1][0] 是这第二个字符串的第一个字符。 它的地址是一个 char 地址,第一个字符就存放在这里。

这两个地址都是不同事物的地址,所以它们指向不同的地方很正常。

av[1]&av[1][0] 分别是指针值(指向第一个char)和第二个字符串的第一个char的地址,所以 它们必须是显示相同值的指针. 同样的情况发生在 *av[1]av[1][0]它们代表着相同的指向性字符。

© www.soinside.com 2019 - 2024. All rights reserved.