内存 变量 指针(三)
来源:互联网 发布:股票数据查询网 编辑:程序博客网 时间:2024/06/05 15:47
0. 表达式由运算符及其操作数组成
i++ ++ 是后自增运算符, i是它的操作数
i+=1 += 是求和赋值运算符, i和1都是它的操作数, i是左操作数, 1是右操作数
1. 左值和左值表达式
可以放在赋值运算符左侧的操作数是左值
如果一个表达式的计算结果是左值,那么这个表达式是左值表达式
所以左值表达式也可以放在赋值运算符的左侧
2.右值和右值表达式
右值不能放在赋值运算符左侧
如果一个表达式的计算结果是右值,那么这个表达式是右值表达式
例如:
1 数值常量, 字面值
'A' 字符常量, 字面值
"ABC" 字符串常量,字面值
1+2 数值求和表达式, 结果是右值, 所以是个右值表达式
int i=1; i++ ; i++的结果是右值,所以是个右值表达式
(未经验证,是当前的猜测:右值不在内存中存放, 是个"瞬间值",只出现在CPU寄存器中,所以没有地址)
3.指针变量的声明和它的"间接访问表达式" (按首地址读写内存)
int a=1;
int *p_int=&a; 指针变量声明,同时对指针变量赋初值
*p_int=3; 对"间接访问表达式"赋值, *p_int是个表达式,是个左值表达式
第二行和第三行的赋值表达式的形式相似,不易理解
第二行是对p_int这个变量进行赋值 (因为这一行是变量声明)
第三行是对 *p_int这个表达式赋值 (这里出现了p_int这个变量,但不是对它赋值,而是对整个表达式赋值)
3.1 在C语言中指针变量的一个重要用法就是通过*运算符形成一个"左值表达式"
再对整个"左值表达式"的计算结果(左值)进行赋值
3.2 "左值"就是内存中特定的一片字节,这与第一篇中的观点对应
(一个变量就是内存中特定的一段字节,一段可以存入和读出数据的内存字节)
3.3 除了*外, []本质上也是间接访问运算符, 一个数组变量的某个元素,实质上是个表达式,一个左值表达式
int a[3]={1,3,5};
a[1]+=1; a[1]是个左值表达式(但a是只读指针变量),对它赋值,就是对特定内存段写入数值
6.关于i++和++i
i++ 这个表达式的计算结果是 "自增前的i"
(注意, i++是个右值表达式, "后++"会对i的值加1,但整个表达式的值是i自增前的值)
++i 这个表达式的计算结果是 "自增前的i"+1 (注意, ++i也是个右值表达式)
int a, i=1;
a=i++;
a=++i;
下面这两行说法会给我们以严重的误导
i++是在使用i这个变量之后, 再对i进行自增运算
++i是在使用i这个变量之前, 先对i进行自增运算
a=i++; 按上面说法,似乎是用i对a赋值,这是错误的
在对a赋值时,并不使用i的值, 而是使用 i++这个表达式的值,也就是i++这个表达式的计算结果
7. 数组变量的概念还有些不清晰
int a[]={1, 3, 5};
数组变量是说a吗? 不是, 数组变量a应该是说存放{1, 3, 5}这三个数的"特定的"的那片内存
那么a是什么?一个可能,是个只读型的指针变量,存放着这片内存的首地址(必须是只读,因为需要始终对应这个首地址)
a就只是一个指针, 用于不同表达式, 会有不同的效果
- 内存 变量 指针(三)
- 指针变量内存
- 变量 内存 指针
- 变量 内存 指针(二)
- 内存 变量 指针(四)
- 指针与内存(三)
- 指针变量与内存分配
- 指针变量与内存分配
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量及内存分配
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量以及内存分配
- 指针变量所占的内存
- 指针做形参做局部变量以及内存分配
- 指针做形参做局部变量以及内存分配
- 关于键盘出现与隐藏时调整UITextField的显示位置问题
- android项目源码解析01:新浪微博客户端源码解析
- Android4.0新增API
- PropertyUtils类
- U盘修复工具哪个好?7款u盘低级格式化工具PK
- 内存 变量 指针(三)
- Android4.1新特性及新增API
- mysql -- outfile/dumpfile/load_file
- Oracle使用并行建索引需要注意的问题
- PHP PDO 学习笔记
- 用户交互输入--mtd-utils代码一例
- Android4.2新特性及新增API
- android基础知识1:json解析及简单例子
- 浅谈多线程保护---条件变量和互斥锁