指针:
指针理解的2个要点:
1. 指针是内存中一个最小单元的编号,也就是地址。
2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
注:平时我们口中所说的指针其实就是指针变量。
指针和指针类型:
指针的类型虽然字节都为4(32位)或者8(64位),但是指针类型在解引用的时候访问几个字节。
//演示实例
#include int main()
{
int n = 0x11223344;
char *pc = (char *)&n;
int *pi = &n;
*pc = 0;
*pc+1; //跳过4个字节
*pi = 0;
*pc +1;//跳过1个字节
return 0;
}
注:int和float指针是不能混用的,虽然解引用操作是一样的但是它们对于地址的操作是不也一样的。
野指针:指针指向的位置是不可知的
产生原因:
1.未初始化
2.指针越界访问
3.指针指向的空间释放
指针的加减:
|指针 - 指针|=指针和指针之间元素的个数(前提:指向同一片内存的指针才有意义)
指针的关系运算:
标准规定: 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与 指向第一个元素之前的那个内存位置的指针进行比较。
指针和数组:
#include int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,0};
printf("%p\n", arr);
printf("%p\n", &arr[0]);
return 0;
}
由此可见arr,&arr[i]的地址都是一样的
二维指针:用来存放一维指针变量的地址
对于二级指针的运算有:
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa .
int b = 20;
*ppa = &b;//等价于 pa = &b;
**ppa 先通过 *ppa 找到 pa ,然后对 pa 进行解引用操作: *pa ,那找到的是 a .
**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;
指针数组: