出于性能考虑,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;
}
}
出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则的更多相关文章
- C语言:传值,传地址
形参:形式参数实参:实际参数 传值: 把实参的值复制给形参, 修改函数内的形参,不会影响实参. 传地址: 指针传值,形参为指向实参地址的指针 当对形参的指向操作时,相当于对实参本身进行的操作 #inc ...
- c语言 参数传值和传地址
static void TestCharP(char **p) { char *q = "ssssss"; *p=q; } static void TestCharP1(char ...
- 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...
- 智能SQL优化工具--SQL Optimizer for SQL Server(帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 )
SQL Optimizer for SQL Server 帮助提升数据库应用程序性能,最大程度地自动优化你的SQL语句 SQL Optimizer for SQL Server 让 SQL Serve ...
- 用户点击确认登录,自动跳转下面地址得到code
PHP获取微信openid 简单教程 WEB 2014年10月29日 10868浏览 6评论 获取code https://open.weixin.qq.com/connect/oauth2/ ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- c语言二维数组传递
c语言二维数组传递,目前我总结三种方法,以及纠正一个不能使用的方法 /********************************* * 方法1: 第一维的长度可以不指定 * * 但必须指定第二维 ...
- 使用批处理文件,自动设置计算机IP地址
WIN7批处理设置IP地址不成功,显示“The filename, directory name, or volume label syntax is incorrect.”错误, 解决方法:将“本地 ...
- Win7 SP1语言包微软官方下载地址及使用方法 2
情形一:如果您的系统版本是企业版.旗舰版,可以在Windows update中检测语言包按照提示下载安装即可.如果觉得Windows update不方便的话,可以在本文第二部分中下载所需的语言包,下载 ...
随机推荐
- Android studio 学习资料汇总
.Android studio 文件结构: https://www.aswifter.com/2015/07/07/android-studio-project-struct/ .Android st ...
- C# ToShortDateString() ToString() 设置日期格式的区别
在C#中,ToShortDateString()是用于显示短日期格式的方法,如果使用下面的语句: Label1.Text = DateTime.Now.ToShortDateString(); 那么, ...
- pycharm开发python利器入门
内容包含:pycharm学习技巧 Learning tips.PyCharm3.0默认快捷键(翻译的).pycharm常用设置.pycharm环境和路径配置.Pycharm实用拓展功能:pycharm ...
- rand()产生随机数 及其和clock()的不同
rand()使用 首先我们要对rand&srand有个总体的看法:srand初始化随机种子,rand产生随机数. 定义函数 : int rand(void) 函数说明 :因为rand的内部实现 ...
- 【iCore1S 双核心板_FPGA】例程十四:FSMC总线通信实验——独立地址模式
实验原理: STM32F103上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...
- Linux(C/C++)下的文件操作open、fopen与freopen
open是linux下的底层系统调用函数, fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的 ...
- talk 1
话转偏锋 让别人可以接话, 同时可以设计转换到的话题, 把"谈话带到正确的轨道", 就像下象棋一样, 要看三步 A: 很喜欢看篮球比赛, 对B说 我每次都堵湖人队会赢 B: 篮球最 ...
- java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landroid/support/v7/appcompat/R$drawable
出现java.lang.NoSuchFieldError: No static field abc_ic_ab_back_mtrl_am_alpha of type I in class Landro ...
- Eclipse 4.4(luna) 安装Veloeclipse 2.0.8时报错的问题
在Eclipse下编辑Velocity模板的插件,支持语法着色,代码向导等功能,简单好用,没有可视化编辑. Eclipse的更新地址是:http://veloeclipse.googlecode.co ...
- Spark学习笔记——键值对操作
键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...