专题五:数组与指针
1. 数组的定义和初始化
int a[] ={1, 2, 3} //定义一个长度为3的int类型的数组,并初始化为1, 2, 3
char b[10] ={0}; //定义一个长度为10的char类型的数组,并初始化为0
char*str[10] = {0}; //定义一个长度为10的char*类型的数组,保存10个字符串的地址
int n; int arr[n]; //定义一个变长数组
2. 数组的类型
int a[5] //变量a的类型为int [5]
char b[10] //变量b的类型为char [10]
char* c[10]//变量c的类型为char* [10]
3. 数组的长度:sizeof(数组名)/sizeof(数组名[0])
int a[10]; //sizeof(a) / sizeof(a[0]), sizeof(int[10]) / sizeof(int)
4. 定义int arr[10],&arr, arr, &arr[0]三者的区别
&arr:为数组arr的地址,即就是变量arr的地址,该类型为数组指针int (*)[10]
arr:为数组的首地址,该类型为 int* const arr
&arr[0]:为数组首元素的地址,该类型为 int*
*(arr+1) =arr[1];
arr+2 =&arr[2];
*((int*)(&arr+1)-1)= arr[9]
5. 指针数组和数组指针
指针数组:是一个数组,用来保存地址变量
int* arr[10]//定义一个数组arr,保存十个int*类型的数据
数组指针:是一个指针,用来指向一个数组
int (*p)[10]//定义一个指针p, 用来指向一个长度为10的int类型的数组
int arr[10];
p =&arr;
6. 指针数组、二级指针和二维数组的区别
int arr[10];
int* p =arr; //p[0], *(p+1)
int*arr[10];
int** pp =arr //*arr[0]==**pp, *(*(arr+1))== *pp[1]
int a1[3],a2[3], a3[3];
int* b[3] ={a1, a2, a3} //int b[3][3]
7. 数组与字符串
char str1[]= “hello world”;
char* str2 =“welcome to tarena”;
str1 = str2;//错误,str1为char* const类型的,为指针常量,是个常量
str2 = str1;//正确,str2能指向任意类型的字符串
str1[0] = ‘H’;//正确,str1指向了一块能修改的内存
str2[0] = ‘H’;//错误,str2指向了一块只读的内存区域,因为字符串字面值保存在代码区,为只读区域
sizeof(str1);//为12,应为sizeof(char [12]),包过’\0’字符
strlen(str1);//为11,strlen函数求字符串大小不包过’\0’
sizeof(str2);//为4,因为str2为char*类型,所以sizeof(char *) = 4
strlen(str2);//为16
注意:sizeof为运算符,strlen是库函数,sizeof是对数据类型求大小,strlen是求字符串的长度,不包过’\0’结束字符
8. 空指针(void*)
(1)代表任意类型的指针
(2)一切类型的指针都可以隐式转换为空指针
(3)对空指针不能解引用
(4)空指针支持计算,但是统一按单字节处理