指针
指针是一个变量,它的值是一块内存的地址。
声明指针或者不再使用指针后都要将其置为0
野指针:未被初始化的指针
悬空指针:指针所指向的内存地址已经被释放的一种指针
int i1 = 10;
int *p1 = &i1; //& 取地址符
//%#x 输出 十六进制
printf("i1 地址:%#x\n", &i1);
printf("p1 值:%#x\n", p1);
printf("p1 地址:%#x\n", &p1);
可以看到,i1的内存地址与p1的值相同, 而p1的地址又是在一块单独的内存地址存储。
而 * 就是解引用 解析并返回内存地址中保存的值。
比如我们要取上面p1指向内存的值就用以下方法来取。
printf("取指针指向内存的值 p1:%d\n", *p1);
指针运算:对指针进行算术运算。
c语言中的数组其实就是一块连续的内存,这里我们通过数组来展示指针的运算
int array1[] = { 1, 2, 3, 4, 5, 6 };
int *array_p1 = array1;
for (size_t i = 0; i < 4;i++){
printf("数组中的元素%d\n", *array_p1++); 这边我们通过+1 , 使指针移动到下一位
}
数组指针
在c语言中,指针和数组名都表示地址
1、数组是一块内存连续的数据。
2、指针是一个指向内存空间的变量。
//数组指针 数组的指针
int array2[2][3] = { { 11, 22, 33 }, { 44, 55, 66 } };
//数组指针 int[3] 类型的指针
int (*array2_p2)[3] = array2;
//直接取值获取的是数组中第一个元素 11
printf("array_p2值: %d\n", *array2_p2);
// 如果想取 22
printf("array_p2值: %d\n", *(*array2_p2 +1));
//如果想取55则
printf("array_p2值: %d\n", *(*(array2_p2+1) +1));
为什么那样获取55呢?
//拆分
//1、 指针偏移 因为array1的类型是3个int的数组 所以 +1 移动了12位
array2_p2+ 1
//2、获得{44,55,66}数组 (*(array2_p2 + 1))[1] = 55
(*(array2_p2 + 1)
//3、对数组执行 +/- 相当于隐式的转为指针
//获得 55 的地址 再解地址
*(array2_p2+ 1) + 1
这里我们就讲完指针了。