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 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
我希望这能澄清你的疑问。
如果有人告诉您 char **av
声明了一个二维数组,那他们是在伤害您。在char **av
中,av
是一个指向char *
的指针,可能是几个中的第一个char *
。所以 av[1]
是一个 char *
——它是一个指向 char
的 指针 ,而 &av[1]
是 地址那个指针.
av[1][0]
是av[1]
指向的char
,&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
是指向 char
指针数组的指针。所以它的第二个元素(数组的第二个元素)确实是一个指针。 &av[1]
是它的地址(指针的地址,不是字符的地址)。
另一方面,av[1][0]
是第二个字符串的第一个字符。它的地址是一个char
地址,其中存储了第一个字符。
两个地址是不同事物的地址,所以指向不同的地方是正常的。
av[1]
和 &av[1][0]
分别是指针值(指向第一个字符)和第二个字符串的第一个字符的地址,所以 它们必须是显示相同值的指针。 *av[1]
和 av[1][0]
也是一样,它们代表相同的指向字符。
怎么了? 这个问题看不懂。。。 我知道数组的第一个元素存储整个数组的地址。但是在这种情况下我想不通。
#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 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
我希望这能澄清你的疑问。
如果有人告诉您 char **av
声明了一个二维数组,那他们是在伤害您。在char **av
中,av
是一个指向char *
的指针,可能是几个中的第一个char *
。所以 av[1]
是一个 char *
——它是一个指向 char
的 指针 ,而 &av[1]
是 地址那个指针.
av[1][0]
是av[1]
指向的char
,&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
是指向 char
指针数组的指针。所以它的第二个元素(数组的第二个元素)确实是一个指针。 &av[1]
是它的地址(指针的地址,不是字符的地址)。
另一方面,av[1][0]
是第二个字符串的第一个字符。它的地址是一个char
地址,其中存储了第一个字符。
两个地址是不同事物的地址,所以指向不同的地方是正常的。
av[1]
和 &av[1][0]
分别是指针值(指向第一个字符)和第二个字符串的第一个字符的地址,所以 它们必须是显示相同值的指针。 *av[1]
和 av[1][0]
也是一样,它们代表相同的指向字符。