目录
一. 指针是什么
1)指针是内存中一个最小单元的编号,也就是地址
2)平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
总结:指针就是地址,口语中说的指针通常指的是指针变量
1.指针变量
2.如何编址?
二. 指针和指针类型
#include <stdio.h>
//演示实例
int main()
{
int n = 10;
char *pc = (char*)&n;
int *pi = &n;
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
int main()
{
int arr[10] = { 0 };
//如果希望按照一个整型的形式访问
int* p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
*p = 0x11223344;
p++;
}
//假设你希望,你访问这个40个字节的时候,是以字节为单位访问
char* p = (char*)arr;//int*
int i = 0;
for (i = 0; i < 40; i++)
{
*p = 'x';
p++;
}
return 0;
}
三. 野指针
3.1 野指针成因
1. 指针未初始化
2.指针越界使用
3.指针指向空间释放
p继承了a已经销毁的地址,所以p为野指针
3.2 如何规避野指针
1. 指针初始化
2. 小心指针越界(不操作,仅仅指向外部某条件)
3. 指针指向空间释放即使置NULL(零地址数向下一段空间用户不能访问)
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
四. 指针运算
4.1指针加减整数
#define N_VALUES 5
float values[N_VALUES];
float *vp;
//指针+-整数;指针的关系运算
for (vp = &values[0]; vp < &values[N_VALUES];)
{
*vp++ = 0;
}
4.2指针减指针
int main()
{
int arr[10] = { 0 };
printf("%d\n", &arr[0] - &arr[9]);
return 0;
}
4.3指针的关系运算
五. 指针和数组
#include <stdio.h>
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;
}
数组名:首元素地址
int main()
{
int arr[10] = { 0 };
printf("%p\n", arr);
printf("%p\n", arr+1);
printf("%p\n", &arr[0]);
printf("%p\n", &arr[0]+1);
printf("%p\n", &arr);
printf("%p\n", &arr+1);
return 0;
}
输出:
0133F840 +4
0133F844
0133F840 +4
0133F844
0133F840 +28
0133F868
六. 二级指针
int main()
{
int a = 10;
int* pa = &a;//pa是指针变量(一级指针)
int** ppa = &pa;//ppa是一个二级指针
int*** pppa = &ppa;//pppa就是三级指针
return 0;
}
七. 指针数组
int main()
{
int data1[] = { 1,2,3,4,5 };
int data2[] = { 2,3,4,5,6 };
int data3[] = { 3,4,5,6,7 };
//arr就是一个指针数组
int* arr[3] = { data1 ,data2, data3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}