zoukankan      html  css  js  c++  java
  • 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则

    #include <stdio.h>
    int main(void) {
    	char array[5];
    	printf("array=%p,&array[0]=%p,&array=%p
    ",array,&array[0],&array);
    	printf("array=%d,&array[0]=%d,&array=%d
    ",array,&array[0],&array);
    	f();
    }
    
    void f(char array[]) {
    	printf("array=%p,&array[0]=%p,&array=%p
    ",array,&array[0],&array);
    	printf("array=%d,&array[0]=%d,&array=%d
    ",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("
    The 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;
    	}
    }
    

      

  • 相关阅读:
    死啃了String源码之后
    springBoot中Bean的生命周期
    @RequestMapping,@RequsetBody等注解说明
    mybatis的逆向工程的使用
    java中的Arrays这个工具类你真的会用吗
    Search in Rotated Sorted Array leetcode的第33道题
    看了Java的Class的源码,我自闭了
    面试被问了三次的http状态码到底有什么
    搞懂HashMap,这一篇就够了
    十大排序的java实现(配有动图)
  • 原文地址:https://www.cnblogs.com/rsapaper/p/10491626.html
Copyright © 2011-2022 走看看