gpt4 book ai didi

c - 为什么解引用运算符无法返回 "pointer to an array"变量指向的值?

转载 作者:行者123 更新时间:2023-11-30 18:24:18 24 4
gpt4 key购买 nike

考虑这个程序,

#include <stdio.h>

int main(){
int a[][4] = {2,3,4,5,
43,32,76,3
};
int *p;
int (*q)[4];

p = (int *)a;
q = a;
printf("%u\t%u", (unsigned int)p,(unsigned int)q);
printf("\n%d\t%d",*(++p),*(++q));
return 0;
}

在上面的程序中,我定义了两个指针,

1) 整数指针

2) 指向数组的指针

使用GCC编译器编译时,遇到两个疑问,

问题 1:

为什么会这样,声明,

printf("\n%d\t%d",*(++p),*(++q));

当我尝试取消引用(++q)时返回地址?

问题2:

有什么方法可以使用“指向数组的指针”变量('q' - 在这个程序中)来访问一行中的连续元素?

编译器:GCC;操作系统:Ubuntu

最佳答案

  1. *(++q) 不“返回地址”。它返回 int[4] 类型的结果,它是 array 类型的左值。该左值引用数组 aa[1] 子数组。

    这意味着您的问题的标题根本不准确:在这种情况下,解引用运算符确实返回了它应该返回的内容。该指针被声明为指向数组的指针,解引用运算符的计算结果为数组类型的左值。

    但是,此后您立即在上下文中使用该数组左值,该数组左值衰减为指针类型,就像任何其他数组一样(请参阅 What is array decaying?Why do arrays in C decay to pointers? )。将数组作为参数传递给 printf 恰好就是这样的上下文。因此,原始数组左值衰减为指针。该指针值指向 a[1] 的开头,与 &a[1][0] 相同。该指针值被传递给 printf,并且您尝试使用 %d 打印它。

    (请注意,在 printf 中使用 %d 打印指针值会触发未定义的行为。)

  2. 好吧,您可以通过任何您希望的方式访问它们

    q = a;
    q[1][1] = 42; // accesses `a[1][1]`
    ++q;
    (*q)[2] = 5; // accesses `a[1][2]`

关于c - 为什么解引用运算符无法返回 "pointer to an array"变量指向的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com