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

  

出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则的更多相关文章

  1. C语言:传值,传地址

    形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...

  2. c语言 参数传值和传地址

    static void TestCharP(char **p) { char *q = "ssssss"; *p=q; } static void TestCharP1(char ...

  3. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

  4. 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )

    SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...

  5. 用户点击确认登录,自动跳转下面地址得到code

    PHP获取微信openid 简单教程 WEB   2014年10月29日  10868浏览  6评论 获取code https://open.weixin.qq.com/connect/oauth2/ ...

  6. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  7. c语言二维数组传递

    c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...

  8. 使用批处理文件,自动设置计算机IP地址

    WIN7批处理设置IP地址不成功,显示“The filename, directory name, or volume label syntax is incorrect.”错误, 解决方法:将“本地 ...

  9. Win7 SP1语言包微软官方下载地址及使用方法 2

    情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...

随机推荐

  1. 为何float有效位数为7位?

    为何float有效位数为7位? 首先我们应该明确一点:C语言中,%f表示保留7位有效数字7位有效数字: 是指 整数部分 和小数部分一共7位 单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^ ...

  2. 《网络编程》IPv4 与 IPv6 相互操作

    前言 因为互联网终端不断添加.IPv4 地址长度(32位)已不可以满足要求.所以出现了 IPv6地址(128位).可是现有应用程序大部分还是採用 IPv4 地址形式,所以必须解决 IPv4 与 IPv ...

  3. 一篇文章掌握RequireJS常用知识

    本文采取循序渐进的方式,从理论到实践,从RequireJS官方API文档中,总结出在使用RequireJS过程中最常用的一些用法,并对文档中不够清晰具体的内容,加以例证和分析,分享给大家供大家参考,具 ...

  4. 【原】在Matplotlib绘图中添加Latex风格公式

    Matplotlib绘图的过程中,可以为各个轴的Label,图像的Title.Legend等元素添加Latex风格的公式. 只需要在Latex公式的文本前后各增加一个$符号,Matplotlib就可以 ...

  5. halcon区域运算

    区域运算: Ø 并:union1().union2(): Ø 交:intersection(); Ø 差:difference(); Ø 补:complement():

  6. 面向对象方法的重载(overloading)和覆盖(overriding)。

      在有些JAVA书籍中将overriding称为重载,overloading称为过载. Overloading在一个类中可以定义多个同名方法,各个方法的参数表一定不同.但修饰词可能相同,返回值也可能 ...

  7. Linux下使用vim命令编辑与修改文本内容

    输入 vim --help VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26 2017 20:13:43) 用法: vim [参数] [文件 .. ...

  8. SQL导出数据到EXCEL的问题

    DTS导出向导 不会 我这有个是用C#语言写的 try { Excel.Application xApp = new Excel.ApplicationClass(); xApp.Visible = ...

  9. mysqldump导出数据时,某些表不导出,排除某些表,不导出某些表

    需求说明: 今天一同事问,在通过mysqldump导出数据库的时候,能不能把某些表不导出,或者叫做排除在外呢, 记得应该是可以实现,就搜索了下,通过mysqldump的--ignore-table参数 ...

  10. ThinkingInJava 学习 之 0000004 初始化与清理

    1. 用构造器确保初始化. 不接受任何参数的构造器叫做默认构造器. Tree tree = new Tree(12); 如果Tree(int)时Tree类的唯一的构造器,那么编译器将不会允许你以其他任 ...