- 浏览: 39026 次
- 性别:
- 来自: 上海
最新评论
看《C专家编程》总结的的。
首先是个经典的例子:
一个文件定义:
char a[4];
另一个文件声明:
extern char* a;
或者
extern char a[];
这两种声明会有什么后果?编译器是怎样的处理?
下面说明。
一.声明和定义的概念
一个变量和函数,定义只能有一次,但是声明却可以多次。
定义:确定对象的类型并分配了内存。
声明:描述了对象的类型,用于指代其他地方定义的对象。
二.数组和指针编译器的处理方式
1.首先明白左值和右值
X = Y;
在这个情况下:
符号X的含义是X所代表的地址,这被称为左值。在编译时可以。
符号Y的含义是Y所代表的地址的内容。这被称为右值。右值在运行时候才知道
数组名是不可修改的左值。
2.数组和指针的不同访问方式
编译器为每个变量分配一个地址。这个地址在编译时候可知,而且运行时候一直保存这个地址。而保存在变量中的值只有在运行才知道。
这里的关键是:
每个符号的地址,在编译时可知。编译器需要一个地址(有时候还需要加上偏移量)的时候,它直接操作。
而指针必须在运行时刻,先取得指针里的地址,然后才能解引用,比数组多了一个取址操作。
例子:
char a[4]="abc";
c= a[i];
数组:
编译器符号表具有一个地址:9980(数组的起始地址)
运行时刻:
步骤1:取i的值,将它与编译器所保存的地址9980相加
步骤2:取地址(9980+i)的内容。
指针:
声明为:
extern char *p;
这将告诉编译器p是个指针,其所指的内容是个字符,为了取得这个字符,需要比数组多一个步骤。
char *p =a;
c= p[i];需要三步
运行时刻:
编译器符号表有一个符号p,它的地址位4624
步骤1.取地址4624的内容 也就是 9980
步骤2.5081内容加上偏移量i形成一个新的地址
步骤3.取步骤2中形成的地址的内容
三.结论
开头的那个例子
如果一个数组
char a[4];
被声明为:
extern char * a;
c= a[i]
运行时刻:
1.取符号表a的地址所指向的内容(数组的第一个元素)
2.将第一个步骤的数据加上偏移量形成一个新的地址。
3.访问这个地址的内容
看到了么?!
把数组第一个元素的内容当做地址,预期未知!!
最好的结果就是程序崩溃!
由上面我们还可以知道数组声明的时候,不需要指定大小。
理由:
1.声明的时候不分配内存,不需要大小信息。
2.访问数组成员的时候,是首地址+偏移量,不需要大小。
四.其他的区别
1.在ANSI C中 ,初始化指针的字符串被定义为只读。
而数组是可以修改的。
首先是个经典的例子:
一个文件定义:
char a[4];
另一个文件声明:
extern char* a;
或者
extern char a[];
这两种声明会有什么后果?编译器是怎样的处理?
下面说明。
一.声明和定义的概念
一个变量和函数,定义只能有一次,但是声明却可以多次。
定义:确定对象的类型并分配了内存。
声明:描述了对象的类型,用于指代其他地方定义的对象。
二.数组和指针编译器的处理方式
1.首先明白左值和右值
X = Y;
在这个情况下:
符号X的含义是X所代表的地址,这被称为左值。在编译时可以。
符号Y的含义是Y所代表的地址的内容。这被称为右值。右值在运行时候才知道
数组名是不可修改的左值。
2.数组和指针的不同访问方式
编译器为每个变量分配一个地址。这个地址在编译时候可知,而且运行时候一直保存这个地址。而保存在变量中的值只有在运行才知道。
这里的关键是:
每个符号的地址,在编译时可知。编译器需要一个地址(有时候还需要加上偏移量)的时候,它直接操作。
而指针必须在运行时刻,先取得指针里的地址,然后才能解引用,比数组多了一个取址操作。
例子:
char a[4]="abc";
c= a[i];
数组:
编译器符号表具有一个地址:9980(数组的起始地址)
运行时刻:
步骤1:取i的值,将它与编译器所保存的地址9980相加
步骤2:取地址(9980+i)的内容。
指针:
声明为:
extern char *p;
这将告诉编译器p是个指针,其所指的内容是个字符,为了取得这个字符,需要比数组多一个步骤。
char *p =a;
c= p[i];需要三步
运行时刻:
编译器符号表有一个符号p,它的地址位4624
步骤1.取地址4624的内容 也就是 9980
步骤2.5081内容加上偏移量i形成一个新的地址
步骤3.取步骤2中形成的地址的内容
三.结论
开头的那个例子
如果一个数组
char a[4];
被声明为:
extern char * a;
c= a[i]
运行时刻:
1.取符号表a的地址所指向的内容(数组的第一个元素)
2.将第一个步骤的数据加上偏移量形成一个新的地址。
3.访问这个地址的内容
看到了么?!
把数组第一个元素的内容当做地址,预期未知!!
最好的结果就是程序崩溃!
由上面我们还可以知道数组声明的时候,不需要指定大小。
理由:
1.声明的时候不分配内存,不需要大小信息。
2.访问数组成员的时候,是首地址+偏移量,不需要大小。
四.其他的区别
1.在ANSI C中 ,初始化指针的字符串被定义为只读。
而数组是可以修改的。
发表评论
-
指针 多维数组
2012-06-05 16:12 733这篇文章写的很好 http://www.cnblogs.com ... -
pImp
2011-11-08 17:24 882http://www.cnblogs.com/JulyZhan ... -
关于构造函数,析构函数,explicit等内容
2011-11-01 17:04 1226一.编译器会为我们做什 ... -
C语言标准
2011-10-21 12:11 12231.K&R C 1978年,丹尼斯·里奇(Dennis ... -
对话框工厂
2011-10-14 18:00 6741.对于工厂我的理解: 良好的封装性。使用和创建,初始化分开。 ... -
函数指针实现回掉函数
2011-10-14 17:47 972用法: 头文件中声明: DECL_LINK( Paintin ... -
typedef和指针结合
2011-10-14 17:42 8041. typedef (int *) pInt; 2.type ... -
const的理解和应用
2011-10-14 16:52 1333const的理解和应用 一.理解 const是一种语义上的约束 ... -
空指针的判断
2011-10-11 17:43 943请看NULL的定义: #if !defined(__cp ... -
GUN C 和 ANSI C的几个区别
2011-10-11 10:52 1114http://hi.baidu.com/deep_pro/bl ... -
浮点数的比较
2011-10-11 10:48 1249一浮点数的知识 1.首先浮点数不用补码表示,只有int型才用补 ... -
关于字符串倒转
2011-10-10 20:25 791有纯倒转,也有按单词为单位的。想做个总结 #inclu ... -
不用中间变量交换数据
2011-10-10 14:42 667那种加加减减的方法其实不对。因为缩小了数据范围。 a1=a1+ ... -
C++模板
2011-10-08 15:52 654template是关键字,template ... -
Quick Sort(快速排序)
2011-10-08 11:20 712Quick Sort算法描述如下: 假设S代表将被处理的序列 ... -
约瑟夫环的解答
2011-10-07 22:48 661http://blog.csdn.net/kittyjie/a ... -
Linux判断大小尾数(big-endian,little-endian)的方法
2011-10-07 22:12 1519static union { char c[4]; u ... -
c++基本文件操作
2011-09-30 00:28 782#include<iostream> #incl ... -
关于文件操作的头文件,类
2011-09-27 14:11 1104C++ 可以看这个 http://www.cplusplus. ... -
关于回车,换行,EOF
2011-09-26 17:41 2813回车换行: http://www.cnblogs.com/fa ...
相关推荐
基于MATLAB车牌识别系统【带界面GUI】.zip。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
DG储能选址定容模型matlab 程序采用改进粒子群算法,考虑时序性得到分布式和储能的选址定容模型,程序运行可靠 这段程序是一个改进的粒子群算法,主要用于解决电力系统中的优化问题。下面我将对程序进行详细分析。 首先,程序开始时加载了一些数据文件,包括gfjl、fljl、fhjl1、cjgs和fhbl。这些文件可能包含了电力系统的各种参数和数据。 接下来是一些参数的设置,包括三种蓄电池的参数矩阵、迭代次数、种群大小、速度更新参数、惯性权重、储能动作策略和限制条件等。 然后,程序进行了一些初始化操作,包括初始化种群、速度和适应度等。 接下来是主要的迭代过程。程序使用粒子群算法的思想,通过更新粒子的位置和速度来寻找最优解。在每次迭代中,程序计算了每个粒子的适应度,并更新个体最佳位置和全局最佳位置。 在每次迭代中,程序还进行了一些额外的计算,如潮流计算、储能约束等。这些计算可能涉及到电力系统的潮流计算、功率平衡等知识点。 最后,程序输出了一些结果,包括最佳位置和适应度等。同时,程序还绘制了一些图形,如电压和损耗的变化等。 综上所述,这段程序主要是一个改进的粒子群算法,用于解决电力
三保一评关系与区别分析
Day-05 Vue22222222222
多功能知识付费源码下载实现流量互导多渠道变现+搭建教程。资源变现类产品的许多优势,并剔除了那些无关紧要的元素,使得本产品在运营和变现能力 方面实现了质的飞跃。多领域素材资源知识变现营销裂变独立版本。 支持:视频、音频、图文、文档、会员、社群、用户发布、创作分成、任务裂变、流量主、在线下载等多种功能,更多功能 正在不断更新中... 支持流量主变现模式,付费下载付费古观看等变现模式。 实现流量互导,多渠道变现。可以独立部署,并绑定自有独立域名,没有域名限制。
住家保姆的工作职责、照顾老人住家保姆服务内容.docx
《高温中暑事件卫生》一级(红色),二级(橙色),三级(黄色),四级(蓝色).docx
职业中专技工学校专业评估表.docx
统计计算使用R一书的源代码Rcode.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
社区居民诊疗健康功能描述 社区居民诊疗健康系统是一个为社区居民提供健康管理、疾病预防、诊疗服务和健康教育的综合平台。该平台致力于提升居民的健康水平,通过智能化、便捷化的服务为居民提供高效的健康保障。以下是该系统的主要功能描述: 1. 用户注册与登录 居民注册:居民可以通过身份证、手机号或社交媒体账号进行注册,填写个人基本信息(如姓名、性别、年龄、联系方式等)并创建账户。 健康档案管理:每个居民注册后,系统会自动生成个性化健康档案,记录个人的健康历史、疾病记录、体检报告等。 2. 健康档案与记录管理 个人健康档案:包括居民的基础健康信息、既往病史、用药记录、免疫接种记录、体检报告等。 诊疗记录管理:记录每次诊疗信息,如诊断、治疗方案、用药情况及随访记录。 健康指标监测:定期记录和更新如血压、血糖、体重、体脂等常见健康指标,便于长期追踪和分析。 3. 在线问诊与诊疗服务 在线咨询:居民可以通过平台预约或直接向社区医生发起在线问诊,获取健康咨询、疾病预防建议、用药指导等服务。 远程诊疗:提供视频问诊功能,方便居民与医生进行实时面对面的远程交流,获得更加详细的诊疗建议。 预约就诊:居民可以
面部、耳廓损伤损伤程度分级表.docx
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
功能完善的小说CMS系统项目全套技术资料.zip
YOLO系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中,文件名末尾是部分类别名称; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值; 【注】可以下拉页面,在资源详情处查看标签具体内容;
项目包含完整前后端源码和数据库文件 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:eclipse/idea Maven包:Maven3.3 服务器:tomcat7
内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。
hw06
这个项目是使用C++实现的即时通信系统,具有高性能、高并发的特点,项目包括客户端和服务器,实现了以下功能:注册、登录、点对点聊、群聊、上下线通知、用户在线信息、拉取好友信息、拉取好友分组信息、拉取群信息、拉取群成员信息;使用到的语言包括C++、Node.js;开源库:Boost C++ Libraries、Openssl、Protobuf、Hiredis、Socket.io;相关开发工具:Redis、Sqlite、Nginx、Microsoft Visual Studio、Visio;
医疗设备管理功能描述 医疗设备管理系统的主要目的是为医院和医疗机构提供高效的设备管理解决方案,确保医疗设备的安全、有效和高效使用。以下是该系统可能具备的功能描述: 1. 设备信息管理 设备登记:记录所有医疗设备的基本信息,包括设备名称、型号、序列号、生产厂家、购置日期等。 设备分类:将设备按类型(如影像设备、监护设备、实验室设备等)进行分类,方便查询和管理。 设备状态跟踪:实时更新设备的使用状态(如在用、维修中、闲置等),确保信息准确。 2. 设备维护管理 维护计划:制定设备的定期维护计划,设置维护周期和提醒通知。 维护记录:记录每次设备维护的详细信息,包括维护日期、维护内容、维护人员等。 故障报告:提供故障报告功能,用户可以快速记录设备故障并提交给维护人员。 3. 设备使用管理 使用申请:医务人员可以在线申请使用特定设备,系统自动记录申请信息。 使用记录:记录设备的使用情况,包括使用时间、使用人员、使用目的等,便于后续查询。 使用统计:生成设备使用统计报表,分析设备的使用频率和效率。 4. 库存管理 库存监控:实时监控医疗设备的库存情况,确保设备充足。 设备采购管理:记录设备采购