一.数组的创建和初始化
1.创建方式: type_t(数组的元素类型) arr_name [const_n] (是一个常量的表达式,用来指定数组的大小)
创建数组 【】必须要给一个常量才可以,不能使用变量
2.数组的初始化:在创建数组的同时给数组的内容一些合理初始值)
二.一维数组在内存中的存储
1.数组在内存中是连续存放的,如果是整型 int 地址差4个字节
访问arr[i], 编译器,是这样做的 *(arr+i) arr --是首元素地址。也可以这样理解 arr+i = &arr[i]
三.指针
1.内存中的一个内存单元,对应一个地址。
2.在32位的平台上指针的大小是4个字节。64位平台是8个字节。
3.指针可以理解成一个变量,是一个用来存放地址的一个变量。
4.指针初始化 int*p = NULL char *p = NULL
5.数组名其实是数组首元素的地址
6.数组名+整数的运算 ,可以获得数组每个元素的地址
四.sizeof与strlen
1.数组名单独放在sizeof内部,数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节
2.表示整个数组的还有 &+数组名 -- 虽然它表示的也是首元素的地址,但是有所不同:例 int arr[] ={1,2,3}
&arr 地址 ---0x0126FE34 arr 首元素地址 -- 0x0126FE34
&arr+1 地址 -- 0x0126FE40 arr +1地址 --0x0126FE38
3. int arr[]={1,2.3} 对于 *arr 其实相当于 *(arr+0)也相当于 arr[o]
4. char arr[] = {'a','b','c'} arr+0 是首元素地址,&arr 整个数组的地址 &arr[0] 首元素的地址
注意:
strlen 是从起始地址往后读取内容
这里sizeof 不需要‘\0’ 但是 strlen 必须要‘\0’否则求的是随机值
5.char *p= "abcd" 在内存中开辟了一块空间 p 把首元素a的地址放在 p里 ,这里并没有创建数组。
6.在二维数组中 int a[3][4] = {0}
sizeof(a) = 48 ,这里的数组名表示整个数组
sizeof(a[0]) = 16 , a[0] 可以看做一维数组 ,相当于第一行
sizeof(a[0]+1) = 4 , a[0] 是第一行,第二列的元素
sizeof(a+1) = 4 ,第二行的地址
sizeof(&a[0]+1) =4 , 第二行的地址
sizeof(*a)= 16 ,第一行的元素 把二维数组当一维数组来看
sizeof(a[3])= 16 sizeof 不运行内部表达式