繁体   English   中英

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

[英]What happens to arrays when they are passed as arguments?

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

那么我的问题是,在创建数组的范围内将其视为什么?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 *类型。 到底是怎么回事?!

作为函数传递时,数组会衰减到指向其第一个元素的指针。 这就是为什么function内的sizeof调用不符合预期的原因,因为它正在指针上调用sizeof 内部function这条线

int size = sizeof array;

array已经衰减到指针,并且您将int*的大小存储在您的size变量中。

您仍然可以通过参数访问数组中的元素,尽管作为表示法

array[1];

是相同的

*(array + 1);

如果您声明函数直接接受int*作为参数而不是数组,则访问数组元素的方式与访问数组元素相同。 所有这一切已经发生衰变是一个指针-你的int array[]中的main仍是一个数组。

抄送常见问题解答:6.4

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

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

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

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

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

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

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

按照您的声明,同时将数组传递给函数Arrays衰减到指针是正确的。

我们可以说数组只不过是指针,唯一的区别是“数组是常量指针的”

int arr[3] = {1,2,3};

因此,这里我们可以通过将指针取消引用用作%d,*(arr + 0);来获取数组元素。

printf("%d %d \n",*(arr+0),arr[0]);

另外,char str =“ string”; printf(“%c \\ n”, (str + 0));

因此,根据我的理解,数组和指针是相同的,唯一的区别是数组是常数POINTERS 即我们不能做arr ++; 排列。

int arr[3];
char *str;

如果我们将数组传递给函数,那么我们对arr所做的任何更改都会反映在调用函数数组中,因为arr,&arr和&arr [0]相同。 指针中的哪里:str和&str不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM