在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)