探讨的问题
1.指针和指针类型
我们都知道指针是一个变量,是一个存放地址的变量。既然如此我们为何不单独定义一个类型呢?而是要用其他类型加星号来作为指针变量,有什么作用呢?
1.决定了指针的访问权限,也就是能访问几个字节。
int main()
{
int a = 0x11223344;//一个十六进制位占4个比特位
int *p = &a;
*p = 0;
return 0;
}
通过调试查看内存,可以看出a的内存是
当*p等于0的时候内存的变化,内存块里的4个字节全部变成0,
int main()
{
int a = 0x11223344;//一个十六进制位占4个比特位
/*int *p = &a;
*p = 0;*/
char *p = &a;
*p = 0;
return 0;
}
而当使用char类型的指针时,同样的地址,*p变成0之后,仅第一个字节变成0
由此可见,指针类型的作用有决定了指针的访问权限,也就是能访问几个字节。
2.指针决定了加减所走的距离。
int main()
{
int arr[10] = {
0 };
int *p = arr;
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + 1) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", i);
}
return 0;
}
arr数组中含有十个整型的空间,总共有40个字节,由于是Int类型的指针,每+1访问4个字节的空间,所以利用for循环可以填满arr数组。打印结果如下
int main()
{
int arr[10] = {
0 };
char*pc = arr;
int i = 0;
for (i = 0; i < 40; i++)
{
*(pc + i) = 'x';
}
return 0
}
当我们用字符型的指针访问时,一个Char类型访问一个字节的内容,当我们填满arr时,需要40次循环填满。
2.野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1.指针指向的空间释放
int *test()
{
int a = 10;
return &a;
}
int main()
{
int *p = test();
printf("%d\n", *p);
return 0;
}
这个test函数传回来的地址没有意义,因为a是我们创建的临时变量,一旦脱离就消失了,所以这个p得到的地址指向的空间已经释放,称之为野指针。
2.指针越界访问
这个就是我们平常的数组,因为下标从0开始,所以定义数组的时候,个数所在的位置不能使用,称为越界。
3.指针的初始化
#include <stdio.h>
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0;
}
如果这样写是错误的,不能这样写。
指针的有效性
由于空指针不能访问,所以在每次使用之前我们要保证指针不等于空指针的时候再访问它,检查指针的有效性。