Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
如果';a';是C中的整数数组,为什么是';a和x2B;1';和'&;a和x2B;1';不同? #包括 int main(){ int a[2]={0,1}; printf(“%d\n”,a); printf(“&a+1%d\n”、&a+1); printf(“a+1%d\n”,a+1); 返回0; }_C - Fatal编程技术网

如果';a';是C中的整数数组,为什么是';a和x2B;1';和'&;a和x2B;1';不同? #包括 int main(){ int a[2]={0,1}; printf(“%d\n”,a); printf(“&a+1%d\n”、&a+1); printf(“a+1%d\n”,a+1); 返回0; }

如果';a';是C中的整数数组,为什么是';a和x2B;1';和'&;a和x2B;1';不同? #包括 int main(){ int a[2]={0,1}; printf(“%d\n”,a); printf(“&a+1%d\n”、&a+1); printf(“a+1%d\n”,a+1); 返回0; },c,C,结果如下: 6422232 &a+1 6422240 a+1 6422236 为什么&a+1和a+1不同?在&a+1中,&a取数组的地址。这将生成一个指向数组的指针,因此添加一个将增加一个数组的大小。这是因为每种类型的指针都有自己的测量单位,添加一个指针总是添加一个指向的对象 在a+1中,a是数组本身。C自动将数组转换为第一个元素的地址。因此,a生成指向元素的指针,因此添加一个元素会增加一个元素的大小 (在&a+1中,a未自动转换为指向第一个元素的指针。将&与数组一起使用是转换的例外。请参见下面

结果如下:

6422232

&a+1 6422240

a+1 6422236


为什么
&a+1
a+1
不同?

&a+1
中,
&a
取数组的地址。这将生成一个指向数组的指针,因此添加一个将增加一个数组的大小。这是因为每种类型的指针都有自己的测量单位,添加一个指针总是添加一个指向的对象

a+1
中,
a
是数组本身。C自动将数组转换为第一个元素的地址。因此,
a
生成指向元素的指针,因此添加一个元素会增加一个元素的大小

(在
&a+1
中,
a
未自动转换为指向第一个元素的指针。将
&
与数组一起使用是转换的例外。请参见下面的注释1。)

笔记
  • 在大多数情况下,数组会自动转换为指向其第一个元素的指针。当数组是
    sizeof
    &
    \u Alignof
    的参数时,或者当数组是用于初始化数组的字符串文字时,不会发生此错误

  • 在C的模型中,指针使用它指向的任何类型的对象的单位。所以说“增加一个数组的大小”有点不精确。但是,如果我们谈论的是使用对象数组中的有效指针导航存储,那么从一个对象移动到另一个对象将遍历相当于对象大小的字节数

  • 不应使用
    %d
    打印指针。C标准中没有定义这种行为。要打印指针,请将其转换为
    void*
    并使用
    %p
    打印:

    #include<stdio.h>
    int main(){
        int a[2] = {0, 1};
        printf("%d\n",a);
        printf("&a + 1 %d\n",&a + 1);
        printf("a + 1 %d\n",a + 1);
        return 0;
    }
    
  • 请注意,
    %p
    不一定产生实际的内存地址。C标准允许实现生成指针的其他表示形式。在没有复杂内存模型的良好C实现中,
    %p
    将打印指向对象的内存地址。但是,这是一个实现质量特性


  • 首先要非常清楚,数组的名称是指向数组的常量指针。所以它总是指向内存中存储数组第一个元素的地址。&a+1和a+1的答案不同,这是因为&a+1以普通字递增数组的地址以递增数组的大小,而a+1除了打印数组的第一个元素外,还打印数组的值,尽管
    a
    &a
    具有相同的值。他们的类型不同。在指针算术类型问题上

    例如,这里的
    a
    衰减为指向(
    a+1
    )中第一个元素(
    int*
    )的指针,然后它被
    sizeof(int)
    递增

    其中as
    &a
    是不会发生衰减的情况。因此
    &a
    的类型为
    int(*)[2]
    (指向由2个
    int
    元素组成的数组的指针)现在,当您添加到
    1
    时,它会按数组的大小或
    2*sizeof(int)
    移动


    这就是它们不同的原因

    “数组名称是指向数组的常量指针”否。数组不是指针,指针不是数组。在许多情况下,都会出现相似之处。您不应该使用
    %d
    打印指针,最好使用
    %p
    。此处发布的所有答案都讨论了所有问题。我对这些答案投了赞成票。用我自己的话来说,这只是一个答案,“指针使用它指向的任何类型对象的单位”——几乎是。更正确的说法是,指针指向的数据将被解释为X。单位的大小不取决于指针指向的对象。只有指针的类型。
    printf("%p\n", (void *) a);
    printf("&a + 1 %p\n", (void *) (&a + 1));
    printf("a + 1 %p\n", (void *) (a + 1));