gpt4 book ai didi

C函数指针行为,数组/数组指针行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:26 25 4
gpt4 key购买 nike

考虑以下代码:

#include <stdio.h>

int ret_five() {
return 5;
}

int main() {
int x[5] = {1,2,3,4,5};

int (*p)();
p = &ret_five;
printf("%d\n", p()); // 1
p = ret_five;
printf("%d\n", p()); // 2

printf("%d\n", sizeof ret_five); // 3
printf("%d\n", sizeof &ret_five); // 4

printf("%d\n", (*p)()); // 5
printf("%d\n", (****p)()); // 6

printf("%p\n", p); // 7 // edited: replaced %d with %p
printf("%p\n", *p); // 8 // same here and in (8), (10)
printf("%p\n", **p); // 9
printf("%p\n", *******p); // 10

printf("%p\n", x); // 11
printf("%p\n", &x); // 12
return 0;
}

我的问题是:

  1. 第 (1) 和 (2) 行打印相同的结果。 ret_five&ret_five 是否具有相同的数据类型?好像不是,因为第 (3) 行和 (4) 行打印了不同的结果。

  2. 从语法的角度来看,在我看来,第 (5) 行应该是调用 p 指向 的函数的正确方法,但当然第 (1) 和 (2) 行打印 5 就好了。这是否有技术原因,或者是因为 (1) 和 (2) 中的调用看起来更清晰而做出的设计决定?还是别的?

  3. 第 (5) 行对我来说非常有意义(因为 p 是一个函数指针,它的解引用值是函数,我们调用函数,它返回 5,我们打印 5) .我很惊讶地发现 (6) 也打印出 5!这是为什么?

  4. 类似地,第 (7)--(10) 行都打印相同的值,即 &ret_five。为什么 (10) 有效?

  5. 第 (11) 和 (12) 行打印相同的值,即 x 的第一个元素在内存中的地址。第 (12) 行是有道理的,但我不太了解第 (11) 行在技术上到底发生了什么。在此上下文中,x 会自动转换或解释为 int* 吗?

  6. 要获取内存中存储 x 的位置,我通常会执行 &x[0],但看起来像 &x 工作得很好,因为 x 是一个数组而不是指针,所以实际上 &x 可能是获取此内存地址的更规范的方法。有理由偏爱其中之一吗?

  7. 一般来说,在上述情况下是否有最佳实践?例如,如果 p = ret_five;p = &ret_five 确实做同样的事情,是否有理由偏爱其中一个?

    <
  8. 而且,如果问题 7 中的两个作业确实做的是完全相同的事情,那么为什么在一种如此严格的语言中,这种松散性是内在的?

最佳答案

Do ret_five and &ret_five have the same data type?

ret_five 是函数指示符,&ret_five 是函数指针。在表达式中,ret_five 被转换为一个函数指针,其值和类型与ret_five 相同。

printf("%d\n", sizeof ret_five);  // 3
printf("%d\n", sizeof &ret_five); // 4

sizeof &ret_five 是正确的。它产生类型为 int (*)() 的函数指针的大小。

sizeof ret_five 是无效的 C 代码,它被 gcc 接受为 GNU 扩展。

printf("%d\n", p);                // 7
printf("%d\n", *p); // 8
printf("%d\n", **p); // 9
printf("%d\n", *******p); // 10

如果p是函数指针,则p*p*****p是等同于 C.

printf("%p\n", x);                // 11
printf("%p\n", &x); // 12

x5 int 元素的数组。在表达式中(除了少数异常(exception)情况,例如它是 & 运算符的操作数),它被转换为指向其第一个元素的指针(x 之后的类型)转换为 int *)。

&x 是指向 5 int 元素数组的指针(&x 的类型是 整数 (*)[5]

关于C函数指针行为,数组/数组指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433495/

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