C 为什么int*b[5]形成8位而不是4位的差?
我编写了一个程序来理解指针的概念,其中我声明了一个由5个整数指针组成的数组,然后我尝试打印数组中各种索引的地址。但我不明白的是,为什么在输出中8位索引的连续地址与4位索引的连续地址之间存在差异 我的代码是:C 为什么int*b[5]形成8位而不是4位的差?,c,arrays,pointers,integer,memory-address,C,Arrays,Pointers,Integer,Memory Address,我编写了一个程序来理解指针的概念,其中我声明了一个由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)));
#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+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位机器)。哪个是您的处理器?英特尔Core i3-2330M处理器2.20 Ghz相关:。对于我来说,忽略所有编译器警告的代码显示:0、0、0、0、0和0。64位big endian万岁。使用%p显示指针。谢谢您,先生,我感谢您帮助我消除困惑。这应该是一个评论,而不是一个答案,除非最后一句是为了回答问题。如果是这样的话,答案应该重新改写,使之清晰明了,而且是第一位的。
b = 79107440
(b+1) = 79107448
(b+2) = 79107456
*(b+2) = 3293532864
*(b+2)+3) = 3293532876
b[2][3] = 3293533008