博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言基础知识点
阅读量:5150 次
发布时间:2019-06-13

本文共 917 字,大约阅读时间需要 3 分钟。

整理记录一些C语言知识点;

更新中...

1.左值,右值

常见的一个错误,

int a[10];

printf("%d",&(a+1));
eror C2102:'&'requires L-value

就是说运算符&需要一个左值类型的变量;

左值,即可以放在等号左边的值,即内存地址;

右值,即可以放在等号右边的值,即变量的值或表达式;

下面这个翻译的很好,

L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.

上面例子中的,(a+1)计算后是一个数值,而&a是正确的,a是一个有确定地址的数组,a是一个内存的地址;

另外,&a+1,表示的是...对整个数组加1;

另外...

还有一个经典的笔试题...

void main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
输出为 2,5
a与&a的值是一样的,但含义不一样,
a表示数组的首地址,即&a[0],对第一个元素取地址,&的对象是元素,所以a+1,即&a[0]+1,偏移一个sizeof(int);
&a表示对数组进行取地址运算,&的对象是数组,所以&a+1是指下一个对象的地址,即数组(对象)后加1,相当于a[5];
而指针变量 ptr指向a[5],所以*(ptr-1),(ptr-1)就是a[4],所以*(ptr-1)为5;
如果数组a的地址是 0x0000,那么a+1是0x0000+sizeof(int),&a+1是0x0000+5*sizeof(int)

从这里也可以看出来....操作符*要加右值运算;

下面附张操作符的运算表,

 

 

转载于:https://www.cnblogs.com/jamesnt/p/3667579.html

你可能感兴趣的文章
python escape sequences
查看>>
【转】Odoo:基本字段类型
查看>>
将中文数字转换层阿拉伯数字
查看>>
用C#调用蓝牙编程
查看>>
图片组件——axure线框图部件库介绍
查看>>
NSString / NSData / char* 类型之间的转换
查看>>
html5 拖放购物车
查看>>
恩尼格码的发明和破解
查看>>
UIAlertController:弹框4步走
查看>>
Java读取txt文件内容
查看>>
国内git项目托管平台
查看>>
linux下memcached安装及php扩展安装配置
查看>>
git本地文件提交
查看>>
NOIP2018提高/普及成绩
查看>>
感知机算法实现(原始形式)
查看>>
selinux 综合大全
查看>>
c/c++ 重载运算符 ==和!=的重载
查看>>
7个很酷的jQuery插件推荐
查看>>
JS选中清空
查看>>
导出excel失败,提醒提示加载类型库/DDL出错
查看>>