一、
1. const修饰的变量,不能被改变。
1. Const定义变量的同时,必须初始化。
2. #define 预编译-->.i
二、回顾数组
1.栈上的布局:从高地址到低地址
数组例外,数组a[0]在低地址,a[5]高地址
2.在vs里面有栈保护,称哨兵位
3.栈保护
4.数组最多分配多大内存?根据栈而定,与你的栈有关系。
5.数组的两个参数:
(1)数组名会退化为指针
(2)数组长度len=sizeof(arr)/sizeof(arr[0])
数组在哪里定义,len就在哪求
6.逆置数组
7. 数组名不能作为左值
聚合类型不能整体赋值
8. sizeof不会运算表达式的值,不会运算
9. 数组和指针的访问方式不一样
数组和指针之间访问数组内的元素
10.char str4[5]=”a,b,c,d”; (放\0)
11.strlen不包含’\0’
作业1.define和const的区别,总结
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
宏定义不分配内存,变量定义分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
(4) 宏替换只作替换,不做计算,不做表达式求解。
2.数组什么时候分配内存?什么时候确定大小?
首先,系统给数据分配内存以存储数据
每个存放数据的内存对应一个地址
对于二维数组a[3][3],我们要找到a[1][2]的值可以寻地址*(*(a+1)+2)找到,这个过程是两个寻地址过程:
1、a+1这个是地址运算(地址a+1),寻地址*(a+1)找到的是a[1]这个地址(&a[1][0])
2、再次进行地址运算a[1]+2,找到了a[1][2]的地址(&a[1][2]),通过寻地址运算找到这个数,*(a[1]+2)上面知道*(a+1)就是地址a[1],把*(a[1]+2)中的a[1]换掉就是*(*(a+1)+2)了
3.查 &arr
arr
一个代表首字母地址,一个代表全部