登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机开发论坛
›
C语言论坛
›
上课了讲解C语言之一维数组
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
上课了讲解C语言之一维数组
[复制链接]
5417
0
yu***
新手上路
发表于 2017-6-7 10:26:19
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
一维数组 int a[5];
a:就是数组名。a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值;a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。a做右值等同于&a[0];
a[0]:表示数组的首元素,也就是数组的第0个元素。做左值时表示数组第0个元素对应的内存空间(连续4字节);做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)
&a:就是数组名a取地址,字面意思来看就应该是数组的地址。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。);&a做右值时表示整个数组的首地址。
&a[0]:字面意思就是数组第0个元素的首地址(搞清楚[]和&的优先级,[]的优先级要高于&,所以a先和[]结合再取地址)。做左值时表示数组首元素对应的内存空间,做右值时表示数组首元素的值(也就是数组首元素对应的内存空间中存储的那个数值)。做右值时&a[0]等同于a。
总结:
1:&a和a做右值时的区别:&a是整个数组的首地址,而a是数组首元素的首地址。
这两个在数字上是相等的,但是意义不相同。意义不相同会导致他们在参与运算的时候有不同的表现。
2:a和&a[0]做右值时意义和数值完全相同,完全可以互相替代。
3:&a是常量,不能做左值。
4:a做左值代表整个数组所有空间,所以a不能做左值。
#include<stdio.h>
int main (void)
{
int a[5]={1,2,3,4,5};
int *p1;
int (*p2)[5];
printf("p1 = %p \n",p1);
printf("p2 = %p \n",p2);
p1 = a;
p2 = &a;
printf("p1 = %p \n",p1);
printf("(p1+1) = %p \n",(p1+1));
printf("p2 = %p \n",p2);
printf("(p2+1) = %p \n",(p2+1));
return 0;
}
复制代码
/******运行结果
p1 = 0xbfbcda54
p2 = 0xbfbcda5c
p1 = 0xbfbcd99c
(p1+1) = 0xbfbcd9a0
p2 = 0xbfbcd99c
(p2+1) = 0xbfbcd9b0
*******************/
/*********分析:*****
1:p1 p2定义的时候被没有进行初始化,所以属于野指针。
2:p1 = a ,a数组名做右值表示首元素首地址,而数组a是int类型,所以首元素首地址中存放的也是int类型的数所以类型匹配。也就是说p1是指向int类型的数的指针
3:p1+1=p1+4 p1指向的数组的首元素首地址,相当于p1指向了数组内部,所以p1+1其实就是p1+sizeof(数组类型)
4:p2 = &a p2的定义是int(*p2)[5]可以理解为是一个指向int [5]类型的指针,所以p2是一个指向数组的指针。
而&a是数组名取地址,表示的就是数组的地址(表示这个地址存放的就是一个数组类型),所以p2和&a的类型匹配。
5:p2 + 1 = p2 + 20 因为p2在定义的时候就被定义为指向一个int [5]类型的地址,所以
p2+1 = p2+sizeof(int [5]);
6:指针+1实际上就是指针+siezof(指针类型),这个其实是在定义的时候就已经确定了,因为在初始化的时候
指针指向的类型一定要和指针定义时候的类型匹配。
例如
char a[5];
int *p; //p是一个指向int类型的指针
p = a ;则类型就不匹配,编译不通过。但是假如这样可以成功初始化,那么指针再运算的时候它的指向就会出错
比如开始p = a 的地址是0xb2000000,那么p+1 则为0xb2000004,而0xb2000004实际上是a[3]而不是a[1]这样就
无法进行运算了,所以指针类型的匹配主要是为了能够进行运算。
*******************************************/
C语言
相关帖子
从零开始学单片机C语言,很全的资料
从零开始学单片机C语言,很全的资料
C语言编程宝典
单片机C语言程序设计实训100例-基于8051 Proteus仿真
C语言经典程序100题(完整版)
【众拳】STM8入门视频教程资料分享
ATmega16运行速度
求助
国产单片机推荐:无锡矽杰微电子XC8P8600
51单片机STC8H8K64U通过RA8889/RA8876如何控制彩屏(I2C源码下载)
举报
回复
20 个评论
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
俄罗斯的6H23+6П43推挽电路机器欣赏
AP3215 8-150V 外围简单 宽输入 电压降压BU
产品描述 AP3215是 一系列外围电路简洁的宽输入电压降压BUCK 恒压恒流驱动器 ,适用
VK1056Q QFN246是一个点阵式存储映射的LCD
产品品牌:永嘉微电/VINKA 产品型号:VK1056Q 封装形式:QFN24L 概述 VK1056Q是
超高清图解示波器使用方法
3线串行接口/工作电压工作电压 2.4-5.2V/VK
产品品牌:永嘉微电/VINKA 产品型号:VK1056B/C 封装形式:SOP/SSOP24 概述 VK1
更多
精华推荐
俄罗斯的6H23+6П43推挽电路机器欣赏
AP3215 8-150V 外围简单 宽输入 电压降压BU
VK1056Q QFN246是一个点阵式存储映射的LCD
一个名为伯努瓦(Gislain)的人,用了3年时
AP2121太阳能草坪灯驱动芯片
超高清图解示波器使用方法
3线串行接口/工作电压工作电压 2.4-5.2V/VK
单片机驱动彩屏最简方案:单片机_RA8889最
更多
社区学堂
俄罗斯的6H23+6П43推挽电路机器欣赏
AP3215 8-150V 外围简单 宽输入 电压降
俄罗斯的6H23+6П43推挽电路机器欣赏
AP3215 8-150V 外围简单 宽输入 电压降压BU
产品描述 AP3215是 一系列外围电路简洁的宽输入电压降压BUCK 恒压恒流驱动器 ,适用
VK1056Q QFN246是一个点阵式存储映射的LCD
产品品牌:永嘉微电/VINKA 产品型号:VK1056Q 封装形式:QFN24L 概述 VK1056Q是
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表