指针类型的意义

指针类型的意义:

1、指针类型决定了指针解引用操作时能够访问内存空间的大小;

举例:

#include <stdio.h>
int main()
{
int a = 0x22334455; //16进制
	//int* p = &a;  //int*为指针类型
	//*p = 0;
	char* p1 = &a; //指针类型为char*
	*p1 = 0;
	/*printf("%p\n", p);
	printf("%p\n", p1);*/
	return 0;
}

 char* p1:  *p1能够访问1个字节的内存空间;

short* p:    *p能够访问2个字节;
  int* p:       *p能够访问4个字节;

double* p:  *p能够访问8个字节;

  char* p1:  *p1能够访问1个字节的内存空间;图解如下:

 

 2、指针+ - 整数

指针类型决定了指针向前或者向后移动了多大的距离(步长),单位:字节;

char* p:         p+1移动一个字节;

int* p:            p+1移动4个字节;

double* p:     p+1移动8个字节;

 举例:

int main()
{
	int a = 0x123123; // 0x123123是16进制刚好是8个字节
	int* p1 = &a;
	char* p2 = &a;
	printf("%p\n", p1);
	printf("%p\n", p1 + 1);//int*类型:p+1向后移动4个字节
	printf("%p\n", p2);
	printf("%p\n", p2 + 2);//char*类型:p+2向后移动2个字节
	return 0;
}

 图解如下:

3、通过指针改变数组元素的值: 

举例:

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = arr; //arr是数组名,p指向数组元素的首地址
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		*(p + i) = 1;
		printf("%d ", arr[i]);
	}	
	return 0;
}

 执行结果如下:

 

 4、野指针(随机值,不确定的值);

导致野指针的三种情况:

指针未初始化导致野指针;

指针越界导致野指针;

指针指向的空间被释放了,导致野指针;

指针未初始化导致野指针; 举例如下:

int main()
{
    int a;      //局部变量不初始化,默认值是随机值
    //int* p;  //局部指针变量不初始化,默认值就是随机值,这种情况是不允许的;

    //*p =10; 
    return 0;

指针越界导致野指针; 举例如下:

int main()
{
    int a[5] = { 0 };
    int* p = &a;
    int i = 0;
    for (i = 0; i < 8; i++)
    {
        //*(p+i) = 1;  //当i=6,7,8时,指针超出了数组a的范围,越界了,这种情况是不允许的;
    }
    return 0;
}

指针指向的空间被释放了,导致野指针;举例如下:

int* test()
{
    //进入test函数后,系统给int a分配内存地址,
    //但是出了函数后,int a的地址被销毁了
    int a = 2;
    return &a;
}
int main()
{
    //进入test函数后,系统给int a分配内存地址,
    int* p = test();

    //但是出了函数后,int a的地址被销毁了,导致*p的地址随机,变成野指针
    *p = 8; 
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值