最近,我痛苦地了解到,如果将数组传递给函数,它将“衰减”为指针。
那么我的问题是,在创建数组的范围内将其视为什么?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 *类型。到底是怎么回事?!
由于数组会立即衰减为指针,因此数组实际上不会传递给函数。您可以假装一个函数接收一个数组作为参数,并通过将相应的参数声明为数组来说明它:
void f(char a[]) { ... }
从字面上解释,此声明将毫无用处,因此编译器转过身来并假装您编写了指针声明,因为该函数实际上将接收到以下内容:
void f(char *a) { ... }
c-faq:当数组是函数的参数时,为什么sizeof不能正确报告数组的大小?:
编译器假装将数组参数声明为指针(在示例中为
char *a;
),并sizeof
报告指针的大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句