为什么 int *b[5] 形成 8 位而不是 4 位的差异?
why does int *b[5] forms a difference of 8 bits instead of 4?
我编写了一个程序来理解 指针 的概念,其中我声明了一个 5 个整数指针的数组 然后我尝试打印数组的各种索引的地址。但是我不明白的是,为什么输出中8位索引的连续地址与4位索引的连续地址之间存在差异?
我的代码是:
#include<stdio.h>
void main()
{
int i;
int *b[5];
for(i = 0; i < 5; i++){
b[i] = (int *) malloc(10 * (sizeof(int)));}
printf(" b = %u \n\n",b);
printf(" (b+1) = %u \n\n", (b+1));
printf(" (b+2) = %u \n\n", (b+2));
printf(" *(b+2) = %u \n\n", *(b+2));
printf(" *(b+2)+3) = %u \n\n", *(b+2) + 3);
*(*(b+2) + 3) = 5;
printf(" b[2][3] = %u \n\n", b[2][3]);
}
输出结果如下
b = 79107440
(b+1) = 79107448
(b+2) = 79107456
*(b+2) = 3293532864
*(b+2)+3) = 3293532876
b[2][3] = 3293533008
很明显,(b+1) 和 b 之间的差异是 8 位。为什么?
首先,地址以字节为单位,而不是位。其次为什么相差8个字节,是因为你在一个使用64位(8字节)地址的系统上。
int *b[5]
是 int 上的指针数组所以 b
和 b + 1
之间的差异等于 sizeof(int*)
在你身上是 8 个字节电脑
首先,您可以使用 %p 来显示指针的地址,而不是 %u。事实上,%d 是一个有符号整数,而 %u 是一个无符号整数,而 %p 是一个指针。
关于答案,在您的机器上,int 显然是 4 个字节,但指针是 8 个字节(典型的 64 位机器)。
我编写了一个程序来理解 指针 的概念,其中我声明了一个 5 个整数指针的数组 然后我尝试打印数组的各种索引的地址。但是我不明白的是,为什么输出中8位索引的连续地址与4位索引的连续地址之间存在差异?
我的代码是:
#include<stdio.h>
void main()
{
int i;
int *b[5];
for(i = 0; i < 5; i++){
b[i] = (int *) malloc(10 * (sizeof(int)));}
printf(" b = %u \n\n",b);
printf(" (b+1) = %u \n\n", (b+1));
printf(" (b+2) = %u \n\n", (b+2));
printf(" *(b+2) = %u \n\n", *(b+2));
printf(" *(b+2)+3) = %u \n\n", *(b+2) + 3);
*(*(b+2) + 3) = 5;
printf(" b[2][3] = %u \n\n", b[2][3]);
}
输出结果如下
b = 79107440
(b+1) = 79107448
(b+2) = 79107456
*(b+2) = 3293532864
*(b+2)+3) = 3293532876
b[2][3] = 3293533008
很明显,(b+1) 和 b 之间的差异是 8 位。为什么?
首先,地址以字节为单位,而不是位。其次为什么相差8个字节,是因为你在一个使用64位(8字节)地址的系统上。
int *b[5]
是 int 上的指针数组所以 b
和 b + 1
之间的差异等于 sizeof(int*)
在你身上是 8 个字节电脑
首先,您可以使用 %p 来显示指针的地址,而不是 %u。事实上,%d 是一个有符号整数,而 %u 是一个无符号整数,而 %p 是一个指针。
关于答案,在您的机器上,int 显然是 4 个字节,但指针是 8 个字节(典型的 64 位机器)。