c -- 初级指针

指针

指针是什么

在这里插入图片描述
我们可以这样理解:
在这里插入图片描述
在这里插入图片描述
总结

  • 指针式用来存放地址的,地址是唯一标标示一块地址空间的。
  • 指针的大小在32位平台是4字节,在64位平台下是8字节

指针的意义

在这里插入图片描述
在这里插入图片描述

int main()
{
	int a = 0x11536;
	int* pc = &a;
	char* p = &a;
	/*指针任何数据的地址都可以储存,但是解引用操作的时候,指针类型决定了可以访问的空间的大小*/
}

指针±整数

int main()
{
	int a = 0x11223344;
	int* pa = &a;
	char* pc = &a;
	printf("%p\n",pa);
	printf("%p\n",pa+1);
	printf("%p\n",pc);
	printf("%p\n",pc+1);

	return 0;
}

运行结果
在这里插入图片描述
指针类型决定了:指针(向前或者向后)走一步走多远
ex:

int main()
{
	int arr[10] = {0};
	int* p = &arr;//数组为int类型,需要用的就是int*
	int i = 0;
	for(;i<9;i++){
		*(p + 1 ) = i;
	}
	return 0;
}

野指针

会报错
1
在这里插入图片描述
2
在这里插入图片描述
3指针指向的空间释放

int* test()
{
	int a = 10;
	return &a;
}
//test()方法结束后就会释放返回管理空间,那么&a就会释放,就会导致空间不是空间不是程序自己的,造成野指针
int main()
{
	int * p = test();
	*p = 20;	
	return 0;
}

如何规避野指针

  1. 指针初始化
  2. 小心指针越界
  3. 指针指向空间释放即使置null
  4. 指针使用之前检查有效性

指针的运算

  • 指针的±整数
  • 指针 - 指针(得到的是中间的元素个数)
    指针减去指针的时候,两个指针指向的都是同一个数组,不是指向同一个数组无意义
    在这里插入图片描述

指针和数组

int main()
{
	int arr[10] = {0};
	printf("%p\n",arr);
	printf("%p\n",&arr[0]);
	//这两个都表示的是地址-首元素地址
	return 0;
}

注意

//1.&数组名 --代表的不是首元素数组地址,代表的是整一个数组
//2.sizeof(数组名)代表的也是整个数组

区别:
在这里插入图片描述

二级指针

int main()
{
	int a = 10;
	int * pa = &a;
	int* * ppa = &pa;
	//二级指针,以此类推还可以有多级指针
	//int** * pppa = &ppa;
	return 0;
}

示意图:
在这里插入图片描述

指针数组 and 数组指针

指针数组 – 数组
数组指针 – 指针

int main()
{
	//指针数组 -- 数组
	int a = 10;
	int b = 20;
	int c = 30;
	int* arr[3] = {&a,&b,&c};

	int i = 0;
	for (; i < 3; i++) {
		printf("%d ", *(arr[i]));
	}
	return 0;
}

运行结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值