Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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语言中,指向整数数组的指针是如何工作的?_C_Arrays_Pointers - Fatal编程技术网

在C语言中,指向整数数组的指针是如何工作的?

在C语言中,指向整数数组的指针是如何工作的?,c,arrays,pointers,C,Arrays,Pointers,看看这个例子: #include <stdio.h> #include <stdlib.h> int main() { int a[5] = {1,2,3,4,5}; // LINE A int (*b)[5] = &a; // LINE B printf("%d\n", (*b)[0]); // LINE C } 我试着在b行写int*b[5]=a,但没有成功。有人能解释为什么这不起作用吗?我认为数组会退化为指针

看看这个例子:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a[5] = {1,2,3,4,5};   // LINE A
    int (*b)[5] = &a;         // LINE B
    printf("%d\n", (*b)[0]);  // LINE C
}
我试着在b行写int*b[5]=a,但没有成功。有人能解释为什么这不起作用吗?我认为数组会退化为指针,所以我不太明白为什么我需要显式地获取via&a的地址。它就像一个已经是指针,因为它已经衰变了,但现在我得到了一个指针的地址?双指针?嗯

有人能解释*b[0]是如何工作的吗?就像我解引用了b,它本身就是一个指向5个整数数组的指针,但我不知何故取了它的第[0]个元素?在这种情况下,第[0]个元素不是5个整数吗?我最终得到了一个整数,它打印出1


我真的很困惑。谢谢。

当您声明-int a[5]时,编译器正在使用“a”作为对内部内存的引用a本身不是一个变量。因此,&a不起作用。

b是指向数组a的指针。解引用b将得到整个数组a。因此,当您在表达式中使用*b时,它表示该解引用数组的名称。由于数组名转换为指向数组第一个元素的指针,*b衰减为指向a或*b的第一个元素的指针*b在衰变后为int*型。因此*b[i]将给出b指向的数组的第i个元素

int a[5]={1,2,3,4,5};

-------In Memory----------
| 1 || 2 || 3 || 4 || 5 |
---------------------------                                         
101   105  109  113  117  //Assume these are addresses
默认情况下,数组名的作用类似于指向第一个元素的指针。 所以一个指针的作用就像指向第一个元素的指针,这里的元素是整数

所以a被衰变为int*a; 这就是为什么若你们增加1,那个么它将跳转到元素的下一个地址,如下所示 它将这样计算:第一个元素的地址+n*sizeofint

但是&a就像一个指向完整数组的指针,在本例中,指针指向5个整数,这意味着 当您向其中添加一个时,它将尝试指向下一个5个整数。如下所示

(&a+1)----->121 //101 + 1*sizeof(a)
这就是为什么在这行中int*b[5]=&a;没有问题,但是当您尝试int*b[5]=a;
它给出错误,因为a是指向单个整数的指针,而as*b[5]是指向5个整数的指针。您不能分配不兼容的指针类型。

1数组衰减为指向其第一个元素的指针,而不是指向其自身的指针。2如果取消引用指向5个整数的数组的指针,则会得到一个5个整数的数组,然后使用[0]进行索引。只有当不是sizeof、\u Alignof C11、&的操作数时,数组才会衰减,这在您的情况下适用,或用于数组初始值设定项中使用的字符串文字。@因此这不适用于_Alignof,因为_Alignof操作数是一个类型名,不能是表达式。c11的草稿版本有缺陷,已在c11的发行版中更正。@ouah:没错!感谢您的更正。不需要衰减到指针就可以工作,数组索引没有指针也可以工作。@Markransem:要完全学究化,就标准而言,数组在这种情况下已经衰减。请参见C99,6.3.2.1 p3。a在很大程度上是一个变量。
(&a+1)----->121 //101 + 1*sizeof(a)