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

av[1] and av[1][0] Not the same address?

怎么了? 这个问题看不懂。。。 我知道数组的第一个元素存储整个数组的地址。但是在这种情况下我想不通。

#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

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

而对于二维数组,&av[1][0] 将具有与 &av[1] 相同的地址;在指针数组中,&av[1][0] 表示获取第二个(索引=1)指针,取消引用它,并给我取消引用的指针目标指向的第一个元素的地址([=14= 的目标]也是一个指针)。

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

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

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

如果有人告诉您 char **av 声明了一个二维数组,那他们是在伤害您。在char **av中,av是一个指向char *的指针,可能是几个中的第一个char *。所以 av[1] 是一个 char *——它是一个指向 char 指针 ,而 &av[1] 地址那个指针.

av[1][0]av[1]指向的char&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 打印它们可以显示不同的结果,即使它们在内存中引用相同的位置。)

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

另一方面,av[1][0] 是第二个字符串的第一个字符。它的地址是一个char地址,其中存储了第一个字符。

两个地址是不同事物的地址,所以指向不同的地方是正常的。

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