1.通过控制总线来明确读和写
通过地址总线来找到该位置
通过数据总线来操作
2.int *p = &a;
p的类型是int*
3.int* 类型的指针进行解引用后一次能访问4个字节
char* 类型的指针进行解引用后一次能访问1个字节
double* 类型的指针进行解引用后一次能访问8个字节
4.%p是用来打印地址的
5.int* p = &a;
p + 1跳过4个字节
char* p = &a;
p + 1跳过1个字节
6.void* 类型的指针不能进行直接解引用和+-
7.const int a = 10;
a是常变量
int const* p = &a;和
const int* p = &a;一样
在*左边就是一样的,都不能通过p对p指向的内容进行修改
8.int* const p = &a;
这里的p不能够再被修改了
9.指针减指针可以得到负数
指针减指针运算的前提条件是:两个指针指向同一块空间
10.可以用指针减指针来模拟strlen
cpp
int my_strlen(char* p)
{
//assert(p != NULL);
char* pp = p;
int count = 0;
while (*p != '\0')
{
p++;
}
return p - pp;
}
11.指针可以比较大小
cpp
int main()
{
int* p;//这是野指针
*p = 100;
return 0;
}
13.静态变量未初始化,默认初始化为0
指针变量也是变量,名字是名字,类型是类型
cpp
int main()
{
int arr[5] = { 0 };
int* p = arr;
for (int i = 0; i < 10; i++)
{
*(p + i) = 1;
}
}
这样会越界访问,注:此处,指针可以指向数组之外的地址.但是不能通过其来访问
15.野指针的成因:
指针未初始化
指针越界访问
指针指向的空间释放
16.在不知道给某个指针赋值什么时,给他赋一个NULL
可以这样创建一个指针
cpp
int main()
{
int a = 5;
int* p;
p = &a;
printf("%d\n", *p);
return 0;
}
17.NULL是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错.(用调试就能看出来)
int* p = NULL;
NULL == (void*)0;
18.规避野指针的方法:
初始化指针
小心指针越界
指针变量不再使用时,及时置NULL,指针使用之前检查有效性(if (p != NULL))
避免返回局部变量的地址