#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. Android使用腾讯浏览服务X5内核

    [前期准备] 腾讯X5 jar包下载地址 [点击打开] 本次完整DEMO源码 [打开Github] [集成步骤] 第一步:下载jar包添加到项目 第二步:添加权限 <uses-permissio ...

  2. linux每日命令(22):find命令参数详解

    一. name选项 文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用. 可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来. 不管当前路径是什么,如果想要 ...

  3. 比Screen更好用的神器:tmux

    安装并启动 tmux tmux 应用程序的名称来源于终端(terminal)复用器(muxer)或多路复用器(multiplexer).换句话说,它可以将您的单终端会话分成多个会话. 它管理窗口和窗格 ...

  4. 【九天教您南方cass 9.1】 14 坐标数据的纠正

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取 在测量空间中. 九天老师的联系方式  点击直接请教九天老师吧! ...

  5. 第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1

    第四百节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5安装python3.5.1 1.检查系统是否安装了python [root@192 ~]# rpm -qa ...

  6. easyradius隆重发布ROS API计费接口,支持ROS 3.3以上版本,实现简单快捷的ROS宽带计费系统云端版

    easyradius对接ROS也是使用的是ROS的api接口,即您要开启 /ip /service api服务,不了解api接口的,可以自己百度噢 开启API,就到easyradius配置通讯接口,具 ...

  7. How to get all Errors from ASP.Net MVC modelState?

    foreach (ModelState modelState in ViewData.ModelState.Values) { foreach (ModelError error in modelSt ...

  8. Linux systemd limits

    https://www.cnblogs.com/IMxY/p/8941022.html limits 关于Centos 7 / RHEL 7 中的limits要了解以下几点: CentOS 7 / R ...

  9. [Python] 动态函数调用(通过函数名)

    2018-04-09 update 利用python中的内置函数 eval() ,函数说明: def eval(*args, **kwargs): # real signature unknown & ...

  10. svn eclipse链接

    先下载site-1.8.22.zip 安装包 然后 在D:\software\eclipse\dropins 目录下新建 svn文件夹 把下载的文件解压到该文件夹下 ,*.xml 删除 不需要 只要 ...