指针是什么:地址
大小 32位4个字节(32个比特位);64位8个字节(64个比特位);//与类型无关;
指针及指针类型
为什么有指针类型:指针类型决定了指针在被解引用的时候访问几个字节;
决定了指针加1减1的跨度;
eg:int* 访问4个跨4个 char*访问1个跨1个;
野指针
概念:指向的位置不可知;
指针没有初始化
越界访问
指针指向的空间释放
//&a被销毁了(值可能是对的,别的进程没有用)
如何避免野指针
- 初始化;
- 小心越界
- 指针指向空间释放及时置为NULL
- 避免返回局部变量
- 使用之前检查有效性;
指针运算
指针加减整数
就是访问下一个变量的指针;
指针间的运算
- 相减;得到指针-指针得到指针之间 | 元素的个数 |(绝对值);相邻空间地址才能减;
- 想加无意义;
指针间的关系运算(比大小)
可以向后越界不可以向前越界比较(部分编译器前后都能越界)
指针和数组
自定义函数中传的是数组首地址,接收方式有两种(以指针形式接收;以数组首地址形式接收;)
arr[i]<===>*(arr+i)
//int main()
//{
// char arr[] = "abc";
// printf("%c", arr[1]);//输出b
// printf("%d", arr[1]);//输出98
// printf("%d %c", &arr[1] ,&arr[1]);//输出乱数乱码;
// printf("%p", arr[1]);//输出62 16进制下的98
// printf("%p ",&arr[1]);//输出地址
// printf("%s", &arr[1]);//输出bc
// printf("%s", arr[1]);//无输出
// printf("%s", arr);//输出abc
// printf("%s", &arr);//输出abc
//}
二级指针
指针数组
存放指针的数组
int main()
{
int a=10;
int b=20;
int arr[10];
int* pa=&a;
int* pb=&b;
int* pc=&c;
int* parr[10]={&a,&b,&c};
return 0;
}
通过1维数组模拟2维数组