指针(第一弹)

hello,c语言最为重要的部分来啦,注意理解喔

一.前言(内存与地址)

  内存是与cpu沟通的桥梁。计算机会为程序执行时的数据(例如定义变量,累加器等)在内存中分配存储空间,就像学生去学校报道时,学校会为每位学生分配宿舍,而每一个存储空间有一个自己唯一的编码,也就是c语言中所说的地址,相当于我们寝室的寝室号,当我们想要访问这个存储空间内的值时,其实就需要先确定这个存储空间的地址

那么,数据存储在内存中后,我们该如何得到它的地址呢?

那么这个时候就要用到我们的取址操作符(&)了。取址操作符可以告诉我们数据在内存中的地址。

  基础应用:定义整型变量a,运用&操作符得到a的地址,通过格式化输出函数printf输出。(进阶应用会在后续讲到)

#include<stdio.h>
void main()
{
	int a;
	printf("%d",&a);
}

注意(详情请看之前的文章):

1.在程序开始执行时,定义的全局变量申请内存空间。

2.当函数开始执行时,函数内定义的局部变量申请空间且函数执行结束释放内存。

3.形参不占用内存空间,实参占用内存空间。 

二.指针

c语言中我们给了地址一个新的名字——指针。指针就是地址

三.指针变量

  当我们通过&操作符得到了数据的地址时,并不能赋值给定义的任一普通变量,因为我们定义的普通变量内部存储的是值,而不能存储地址。这时我们就需要用到另外一种变量——指针变量。

1.定义指针变量

#include<stdio.h>
void main()
{
	int *pa,a;//定义普通整型变量a与指针变量pa
	pa=&a;//指针变量pa指向a的地址
	printf("%d",*pa);
}

 上述代码得出答案是固定的吗?并不是,这就涉及到一个前面知识点的补充——数据在内存中的存储。

数据在内存中的存储地址是计算机随机分配的(无法人为改变)

2.指针变量自增自减

#include<stdio.h>
void main()
{
	int *pa,a;
	pa=&a;
	printf("%d\n",*pa);
	pa++;
	printf("%d\n",*pa);
}

整型变量在内存中占4个字节,指针pa是指向变量a的地址,这里的pa++不是像自增自减运算符一样数值增减1或简单的在地址上加上个1,而是指向下一个存放基本整型数的地址。所以当执行pa++之后,pa发生了巨大的改变。

四.*野指针

野指针:指针指向位置不可知

形成原因:

1.指针未初始化

#include <stdio.h>
void main()
{
	int* p;
	*p = 20;
}

2.指针越界访问

例如: 指针指向超过数组ace的范围 

#include <stdio.h>
void main()
{
	int ace[10] = { 0 };
	int* pa = ace;
	int a = 0;
	for (a = 0; a <= 10; a++)
	{
		*pa = 1;
		pa++;
	}
}

3.指针指向空间释放(局部变量在函数结束后已经释放内存储空间)——置NULL

编程过程中需要规避野指针,以免产生数据损坏,程序崩溃,触发段错误等风险。

今日的分享到此结束啦,下次再见啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值