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
编程过程中需要规避野指针,以免产生数据损坏,程序崩溃,触发段错误等风险。
今日的分享到此结束啦,下次再见啦!