×86 ---->32位的环境
×64 ---->64位的环境
指针:
1.指针是什么
(1).指针是内存中一个最小单元的编号,也就是地址
(2).平时口语中说的指针,通常指的是指针变量,指针变量就是一个变量,是用来存放内存地址的变量
小总结:指针就是地址,口语中说的指针通常指的是指针变量
注意:指针的大小在32位平台就是4个字节,在64位平台就是8个字节(不同平台指针大小不同)
2.指针和指针类型
指针类型的意义:
(1).指针类型决定了指针在被解引用的时候访问几个字节
如果是int*的指针,解引用访问4个字节
如果是char*的指针,解引用访问1个字节
可以推广到其他。
(2).指针的类型决定了指针+-1操作的时候,跳过几个字节
决定了指针的步长
还有就是就算类型所占相同大小的空间,也不能混用,例int*和float*不能混用
3.野指针:
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因:
(1).指针未初始化
(2).指针越界访问
(3).指针指向的空间释放
规避野指针的出现:
(1). 指针初始化
(2). 小心指针越界
(3). 指针指向空间释放即使置NULL
(4). 避免返回局部变量的地址
(5). 指针使用之前检查有效性
以上可以一定程度上避免野指针的出现,但并不是能避免所有野指针的出现
定义还没变成野指针,在用了之后才变为了野指针!
4.指针运算:
(1).指针+-整数
指针解引用之后+1是值+1
指针变量+1是地址向后跳1
例子1:
把数组内所有元素都改为1
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
法1:数组法
for (i = 0; i < sz; i++)
{
arr[i] = 1;
}
法2:指针法1.0
int* p = arr;
for (i = 0; i < sz; i++)
{
*p = 1;//
p++;
}
指针法2.0
int* p = arr;
for (i = 0; i < sz; i++)
{
*(p + i) = 1;
}
return 0;
}
(2).指针-指针
A:指针-指针(取绝对值)得到的结果是指针和指针之间元素的个数
注意:不是所有的指针都能相减,只有指向同一块空间的2个指针才能相减
(3).指针的关系运算:比较大小
5.数组和指针
数组:一组相同类型元素的集合
指针:是一个变量,存放的是地址
但是通过指针可以访问数组!!,还是那句话,数组名是元素首地址
6.二级指针
二级指针变量是用来存放一级指针变量的地址的
7.指针数组
存放指针的数组就是指针数组。