将数组作为参数传递时会发生什么情况?

用户名

最近,我痛苦地了解到,如果将数组传递给函数,它将“衰减”为指针。

那么我的问题是,在创建数组的范围内将其视为什么?sizeof如何区分两者之间的区别?我以为所有数组都是指针,并且方括号将指针向前移动并一次性取消引用。观察以下代码:

[name@localhost lab03]$ cat arraysAsArguments.c
#include <stdio.h>

void function(int array[]) //Treated as pointer
{
  printf("%x", array);
  int size = sizeof array;
  int firstElement = sizeof array[0];
  printf("size: %d\n", size);
  printf("firstElement: %d\n", firstElement);
}

int main()
{
  int array[] = {0,1,2,3,4,5}; // expected size = 6*4 = 24 bytes
  printf("%x", array);
  int size = sizeof array;
  int firstElement = sizeof array[0];
  printf("size: %d\n", size);
  printf("firstElement: %d\n", firstElement);
  function(array);
}

[name@localhost lab03]$ clang arraysAsArguments.c
arraysAsArguments.c:5:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
  printf("%x", array);
          ~^   ~~~~~
arraysAsArguments.c:15:12: warning: conversion specifies type 'unsigned int' but the argument has type 'int *' [-Wformat]
  printf("%x", array);
          ~^   ~~~~~
2 warnings generated.
[name@localhost lab03]$ ./a.out
57c84940size: 24
firstElement: 4
57c84940size: 8
firstElement: 4

在main和function中,array均为int *类型。到底是怎么回事?!

吊床

抄送常见问题解答:6.4

由于数组会立即衰减为指针,因此数组实际上不会传递给函数。您可以假装一个函数接收一个数组作为参数,并通过将相应的参数声明为数组来说明它:

void f(char a[])
{ ... }

从字面上解释,此声明将毫无用处,因此编译器转过身来并假装您编写了指针声明,因为该函数实际上将接收到以下内容:

void f(char *a)
{ ... }  

c-faq:当数组是函数的参数时,为什么sizeof不能正确报告数组的大小?

编译器假装将数组参数声明为指针(在示例中为char *a;),并sizeof报告指针的大小。

我建议您阅读c-faq的整个部分:6.数组和指针

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将函数用作参数时会发生什么情况?

来自分类Dev

以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

来自分类Dev

当我将unpack()作为lua的函数参数调用时,会发生什么情况?

来自分类Dev

如果将很少的参数传递给Shell函数,会发生什么情况?

来自分类Dev

将切片作为参数传递时会发生什么?

来自分类Dev

当我们将int参数传递给重载方法时,会发生什么情况,该重载方法将float作为一个方法的参数,将另一个作为double参数

来自分类Dev

在Haskell中用+编写*时会发生什么情况?

来自分类Dev

在Git中删除分支时会发生什么情况

来自分类Dev

将1Byte数据转换为4Byte时会发生什么情况

来自分类Dev

将属性应用于python中的类方法时会发生什么情况?

来自分类Dev

当我们将jar提交给风暴集群时会发生什么情况?

来自分类Dev

将具有导航属性的对象添加到Db时会发生什么情况?

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

来自分类Dev

当我将0作为getline的第二个参数传递时会发生什么?

来自分类Dev

当我以`even`作为生成器函数调用`even(3)`时会发生什么情况?

来自分类Dev

将字符串文字作为const string&传递给函数时会发生什么?

来自分类Dev

当传递引用参数存储在被调用方对象中,然后被调用方删除时,会发生什么情况?

来自分类Dev

当我们将参数传递给System.out.println()时会发生什么?

来自分类Dev

当我从RAM运行持久性存储实时USB时会发生什么情况?

来自分类Dev

当我离开INT_MAX以外时会发生什么情况?

来自分类Dev

服务在调用stopSelf()后收到启动命令时会发生什么情况

来自分类Dev

不等待HttpClient使用时会发生什么情况

来自分类Dev

将可移动对象插入std :: set失败时会发生什么情况?

来自分类Dev

重复printf说明符标志时会发生什么情况?

来自分类Dev

应用程序在Cordova中退出时会发生什么情况?

来自分类Dev

使用类函数更改S4对象的“类”时会发生什么情况?

来自分类Dev

调用订阅的PayPal REST API执行URL时会发生什么情况

来自分类Dev

通过fcntl锁定位于远程存储上的文件时会发生什么情况?

Related 相关文章

  1. 1

    将函数用作参数时会发生什么情况?

  2. 2

    以Express应用程序作为参数评估require(“ http”)。Server()时会发生什么情况?

  3. 3

    当我将unpack()作为lua的函数参数调用时,会发生什么情况?

  4. 4

    如果将很少的参数传递给Shell函数,会发生什么情况?

  5. 5

    将切片作为参数传递时会发生什么?

  6. 6

    当我们将int参数传递给重载方法时,会发生什么情况,该重载方法将float作为一个方法的参数,将另一个作为double参数

  7. 7

    在Haskell中用+编写*时会发生什么情况?

  8. 8

    在Git中删除分支时会发生什么情况

  9. 9

    将1Byte数据转换为4Byte时会发生什么情况

  10. 10

    将属性应用于python中的类方法时会发生什么情况?

  11. 11

    当我们将jar提交给风暴集群时会发生什么情况?

  12. 12

    将具有导航属性的对象添加到Db时会发生什么情况?

  13. 13

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  14. 14

    构造函数使用1个参数,但基本关键字使用2个参数时会发生什么情况

  15. 15

    当我将0作为getline的第二个参数传递时会发生什么?

  16. 16

    当我以`even`作为生成器函数调用`even(3)`时会发生什么情况?

  17. 17

    将字符串文字作为const string&传递给函数时会发生什么?

  18. 18

    当传递引用参数存储在被调用方对象中,然后被调用方删除时,会发生什么情况?

  19. 19

    当我们将参数传递给System.out.println()时会发生什么?

  20. 20

    当我从RAM运行持久性存储实时USB时会发生什么情况?

  21. 21

    当我离开INT_MAX以外时会发生什么情况?

  22. 22

    服务在调用stopSelf()后收到启动命令时会发生什么情况

  23. 23

    不等待HttpClient使用时会发生什么情况

  24. 24

    将可移动对象插入std :: set失败时会发生什么情况?

  25. 25

    重复printf说明符标志时会发生什么情况?

  26. 26

    应用程序在Cordova中退出时会发生什么情况?

  27. 27

    使用类函数更改S4对象的“类”时会发生什么情况?

  28. 28

    调用订阅的PayPal REST API执行URL时会发生什么情况

  29. 29

    通过fcntl锁定位于远程存储上的文件时会发生什么情况?

热门标签

归档