#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;
}
}