#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. mvc4 强大的导出和不需要上传文件的批量导入EXCEL--SNF快速开发平台3.1

    数据的导入导出,在很多系统里面都比较常见,这个导入导出的操作,在Winform里面比较容易实现,但在Web上我们应该如何实现呢?本文主要介绍利用MVC4+EasyUI的特点,并结合文件上传控件,实现文 ...

  2. 开源的.NET任务调度框架-HangFire

    什么是Hangfire Hangfire 是一个开源的.NET任务调度框架,目前1.6+版本已支持.NET Core.内置提供集成化的控制台,方便后台查看及监控: 另外,Hangfire包含三大核心组 ...

  3. ASCII、Unicode和UTF-8编码的区别

    归纳: 编码 大小 支持语言 ASCII 1个字节 英文 Unicode 2个字节(生僻字4个) 所有语言 UTF-8 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 所有语言 具体 ...

  4. flutter 环境安装以及配置

    首先需要下载flutter源码,以下是github地址: https://github.com/flutter/flutter 然后需要安装git环境吧,下图红框可以自行下载安装 接下来需要安装flu ...

  5. C# 创建 读取 更新 XML文件

    public static class XmlHelper { /// <summary> /// 读取节点值 /// </summary> /// <param nam ...

  6. ORA-03297: 文件包含在请求的 RESIZE 值以外使用的数据

    本文中的45,对应 修改数据文件大小 里面的45 1.移动表前先对表空间做整理 alter tablespace data_cis_test coalesce; 2.在dba_extents找到与ID ...

  7. ELK 性能(4) — 大规模 Elasticsearch 集群性能的最佳实践

    ELK 性能(4) - 大规模 Elasticsearch 集群性能的最佳实践 介绍 集群规模 集群数:6 整体集群规模: 300 Elasticsearch 实例 141 物理服务器 4200 CP ...

  8. hdoj:2033

    #include <iostream> #include <string> using namespace std; int main() { int n; int h, m, ...

  9. Linux Ubuntu 能PING IP但不能PING主机域名的解决方法

    ------------------------------------------------------------------------------- vi /etc/nsswitch.con ...

  10. talk is cheap, show me the code——dcgan,wgan,wgan-gp的tensorflow实现

    最近学习了生成对抗网络(GAN),基于几个经典GAN网络结构做了些小实验,包括dcgan,wgan,wgan-gp.坦率的说,wgan,wgan-gp论文的原理还是有点小复杂,我也没有完全看明白,因此 ...