指针补充
地址 + 1 : 加了一个单位(即数据类型长度)的地址
char* + 1 加个1个字节
int* + 1 加了4个字节
一同声明多个指针变量:
int *pa,*pb;//pa和pb都是 int* 类型
int *pc,pd; //pc是int *类型 pd是int类型
指针的应用:
1.作为函数的参数
2.作为函数的返回值(静态局部变量 全局变量 形参的值(指针))
注意:函数中不能返回局部变量的地址 因为局部变量地址在函数调用之后会被回收
void * : 万能指针
万能指针变量 可以 保存任何类型的内存地址
注意: void *指针不能进行取 * 操作
指针和数组:
数组名是一个只读变量 这是数组名和普通指针的区别
数组名是数组元素的首地址,也是数组中第一个元素的地址
数组在作为函数的参数传递时,其实是传递的是数组元素的首地址
在函数中,数组名已经退化成一个指针,所以在函数时需要传递数组长度
[]下标运算符:
arr[i] == *(arr+i)
数组下标为什么从0开始? 因为第一个元素的偏移量为0,即第一个元素的地址就是数组名的地址。
数组名:
是一个不可以修改的"指针" 数组名不能作为左值
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
int *p = arr;
*p++ ==> 先取 *p 然后再 p++
(*p)++ ==> 先取 *p 然后把这个值再增加1
在函数的形参列表中: int arr[10] arr不是数组 本质上是 int *arr