Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么int*b[5]形成8位而不是4位的差?_C_Arrays_Pointers_Integer_Memory Address - Fatal编程技术网

C 为什么int*b[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)));

我编写了一个程序来理解指针的概念,其中我声明了一个由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+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