//指针类型的意义
#include<stdio.h>
int main(void)
{
int a=0x11223344;
char* pc = &a;
*pc=0;//char类型,字符指针,解引用一次访问了1个字节
//字符类型发生变化,解引用内容就发生了变化
int* pc = &a;
*pc=0;//int类型,解引用一次访问了4个字节
//指针类型的意义:
//1.指针类型决定了指针解引用的权限有多大
//2.指针类型决定了指针走一步,走多远(步长)
#include<stdio.h>
int main(void)
{
int a=10; //a占4个字节,在内存中开辟出一块空间
int *pa =&a; //拿到的是a的4个字节中第一个字节的地址
// 这里我们对变量a,取出它的地址,可以使用&操作符,将a的地址存放在p变量中,p就是一个指针变量
return 0;
}
指针就是变量,用来存放地址的变量。(存放在指针当中的值都被当作地址处理。)
整型指针加1会跳过一个整型,字符指针加1会跳过一个字符。
//指针的解引用
#include<stdio.h>
int main(void)
{
int arr[10] = {0}; //创建一个数组为arr,有十个全是0的元素
int *p = arr; //访问arr的地址
int i = 0; //按顺序访问数组元素的下标
for (i=0;i<10;i++)
{
*(p+i) = 1; //p+i 其实是下标为i的地址,这一步实为将arr数组中的元素都赋值为1
} //重点在调试的过程中观察内存的变化
return 0;
}
指针的解引用总结:
指针的类型决定了,对指针的解引用的时候有多大的权限(能操作几个字节),char*的指针解引用就只能访问一个字节,而int *的指针的解引用就能访问4个字节
野指针:
(概念):指针指向的位置是不可知的
//野指针的成因:
//1.指针未初始化
#include<stdio.h>
int main(void)
{
int *p; //p是一个局部的指针变量,局部变量如果补初始化的话,默认是随机值
*p = 20; //非法访问内存,p未初始化里面存的是一个随机值,*p解引用,就是访问这个随机值的地址
//这里的p就是一个野指针
return 0;
}
//野指针的成因
//2.指针越界访问
#include<stdio.h>
int main(void)
{
int arr[10] = {0};
int* p = arr; //把数组名交给了指针变量p
int i = 0;
for(i=0;i<=11;i++) //这里实际上循环了11次
{
//当指针指向的范围超过数组arr的范围时,p就是野指针
*(p++)=i;
}
return 0;
}
//野指针的成因:
//3.指针指向的空间释放
#include<stdio.h>
int* test() //返回类型为int*
{
int a =10;
return &a; //在这里范围a的地址
}
int main(void)
{
int* p = test(); //调用test函数,用int *的p地址来接收一下
*p=20;
return 0; //a 是放不进去20的,函数调用出int* test的时候,a这个局部变量的生命周期已经被销毁
//这个四个字节的内存已经被还给操作系统了,如果再用*p = 20 去访问这块空间的地址,属于非法访问
}