出于性能考虑,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;
	}
}

  

 

posted @ 2019-03-07 19:04  papering  阅读(323)  评论(0编辑  收藏  举报