出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则
#include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,&array=%p\n",array,&array[0],&array); printf("array=%d,&array[0]=%d,&array=%d\n",array,&array[0],&array); f(); } void f(char array[]) { printf("array=%p,&array[0]=%p,&array=%p\n",array,&array[0],&array); printf("array=%d,&array[0]=%d,&array=%d\n",array,&array[0],&array); }
array=0240FF18,&array[0]=0240FF18,&array=0240FF18
array=37814040,&array[0]=37814040,&array=37814040
array=0240FF34,&array[0]=0240FF34,&array=0240FF10
array=37814068,&array[0]=37814068,&array=37814032
请按任意键继续. . .
当被调函数在其函数体内修改数组元素时,它真正修改的是存储在原存储单元中元素。
出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数。
试想一下,如果以传值的形式将数组传递给函数,那么每个元素的副本都要传递给被调函数。
当需要频繁传递一个很大的数值时,数组元素的复制将是一项既费时又费存储资源的工作。
前言:
数组和结构体都属于“静态的”实体,即他们所占存储空间的大小在程序运行的过程中保持不变。
#include <stdio.h> #define SIZE 5 /* function prototype */ void modifyArray(int b[],int size); void modifyElement(int e); int main(void) { int a[SIZE]= {0,1,2,3,4}; int i; for (i=0; i<SIZE; i++) { printf("%3d",a[i]); } modifyArray(a,SIZE); for (i=0; i<SIZE; i++) { printf("%3d",a[i]); } modifyElement(a[3]); printf("\nThe value of a[3] is %d",a[3]); return 0; } void modifyArray(int b[],int size) { int j; for (j=0; j<SIZE; j++) { b[j] *=2; } } void modifyElement(int e) { e*=2; }
0 1 2 3 4 0 2 4 6 8
The value of a[3] is 6请按任意键继续. . .
软件工程视点:
在定义函数形参时使用类型限定符const,以防止函数对原数组的修改。这又是一个“最小权限原则”的例子。
除非十分必要,函数童年广场不应具有对传递过来的数组进行修改的权限。
#include <stdio.h> #define SIZE 5 /* function prototype */ void tryToModifyArray(const int b[],int size); int main(void) { return 0; } void tryToModifyArray(const int b[],int size) { int j; for (j=0; j<SIZE; j++) { b[j] *=2; } }