如何将一维数组作为函数形参来使用

[09-12 18:31:35]   来源:http://www.88dzw.com  EDA/PLD   阅读:8317

文章摘要:作者:王姗姗,www.88dzw.com嵌入式学院讲师。请看下面的程序:#include <stdio.h>void func1(int arr[]){printf("%d\n",sizeof(arr));arr=arr+1;printf("%d\n",*arr);}void func2(int *arr){printf("%d\n",sizeof(arr));arr=arr+1;printf("%d\n",*arr);}int main(){int a[10]={1,2,3,4,5};int *b=a

如何将一维数组作为函数形参来使用,标签:eda技术,eda技术实用教程,http://www.88dzw.com

  作者:王姗姗,www.88dzw.com嵌入式学院讲师。

  请看下面的程序:

  #include <stdio.h>

  void func1(int arr[])

  {

  printf("%d\n",sizeof(arr));

  arr=arr+1;

  printf("%d\n",*arr);

  }

  void func2(int *arr)

  {

  printf("%d\n",sizeof(arr));

  arr=arr+1;

  printf("%d\n",*arr);

  }

  int main()

  {

  int a[10]={1,2,3,4,5};

  int *b=a;

  printf("%d\n",sizeof(a));

  func1(a);

  func2(a);

  printf("%d\n",sizeof(b));

  func1(b);

  func2(b);

  //a=a+1;

  printf("%d\n",*a);

  b=b+1;

  printf("%d\n",*a);

  return 0;

  }

  为了说明问题,我写了一个简单的测试程序,在主函数中定义了一个a数组,并定义了一个b指针指向该数组的首地址。显然a=a+1是不能通过编译的,因为作为数组而言,a是地址常量,一旦定义是不允许指向其他地址的。

  那么作为b,其仅仅是一个指针变量,里面存放的是a数组的首地址,故可以执行b=b+1,这样使得b指向a+1,也就是a数组中的a[1]。

  下面问题就来了,我们该如何将一个数组作为形参传递给函数,也就是说若有一个实参数组,想在函数中改变此数组中的元素的值,我们该如何处理?

  数组作为形参,和接受它的实参有以下的关系:

  1. 形参和实参都是数组名。

  2. 实参用数组,形参用指针变量.

  3. 实参、形参都用指针变量。

  4. 实参为指针变量,形参为数组名。

  在上述的例子中我们来进一步的讲解。

  首先来看结果:

  40//sizeof(a)

  4//func1(a)

  2//arr=arr+1

  4//func2(a)

  2//arr=arr+1

  4//sizeof(b)

  4//func1(b)

  2// arr=arr+1

  4//func2(b)

  2// arr=arr+1

  1// a

  1//b=b+1;

  在C语言中,数组名是当作指针来处理的。更确切的说,数组名就是指向数组首元素地址的指针,数组索引就是距数组首元素地址的偏移量。理解这一点很重要,很多数组应用的问题就是有此而起的。这也就是为什么C语言中的数组是从0开始计数,因为这样它的索引就比较好对应到偏移量上。在C语言中,编译过程中遇到有数组名的表达式,都会把数组名替换成指针来处理;编译器甚至无法区分a[4]和4[a]的区别。

  我们在题中定义了

  int a[10];

  int *b;

  这两者并不等价,第一句话声明了数组a,并定义了这个数组,它有10个int型元素,sizeof(a)将得到整个数组所占的内存大小,是40;第二句话只是声明并定义了一个int型的指针,sizeof(b)将得到这个指针所占的内存大小,是4。所以说,虽然数组名在表达式中一般会当作指针来处理,但是数组名和指针还是有差距的,最起码有a==&a[0]但是sizeof(a)!=sizeof(a[0])。

  并且在ANSI C标准中,也明文规定:在函数参数的声明中,数组名可以当作指向该数组第一个元素的指针。所以,下面的几种书写形式是等效的:

  void func1(int arr[]){}

[1] [2]  下一页


Tag:EDA/PLDeda技术,eda技术实用教程EDA/PLD

《如何将一维数组作为函数形参来使用》相关文章

分类导航
最新更新
热门排行