本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二.指针变量
1.指针变量的定义
- 指针变量前面的” * “,表示该变量的类型为指针型变量;
一般形式
类型说明符 * 变量名;
float *pointer_1;
//指针变量名是 pointer_1 ,而不是*pointer_1;
- 类型说明书=符表示本指针变量所指向的变量的数据类型;
- *表示这是一个指针变量,(下面有具体的例子,不懂的可以参考);
- 变量名即为定义的指针变量名;
- 举例合法的指针变量定义:
int *pointer_3;//pointer_3是指向int型变量的指针变量
char *pointer_4;//pointer_4是指向char型变量的指针变量
//pointer中文翻译是 指针
- 可以用赋值语句是一个指针变量得到另一个变量的地址,从而使它指向一个该变量
- GNC GCC编译器为指针变量分配的存储空间大小为4字节 我使用的是codeblocks软件,如果有谁想下载可以点开下面的链接,按步骤下载 (2022最新版)codeblocks下载教程
定义指针变量应注意的问题
- 在定义指针变量时必须指定基类型;
- 基类型:数据类型表示该指针变量所指向的变量的数据类型,又称基类型;
- 只有在整型变量的地址才能存放到指向整型变量的指针变量中;
2.指针变量的引用
初识两个操作符 * ,&
-
指针变量若没有赋值或者未初始化不可使用,要有明确的指向
-
取地址运算符 ’ & ‘(单目运算符) 功能:取变量的地址
-
结合性:自右向左;
-
取内容运算符’ * ‘ 也叫取值运算符(单目运算符) 功能:取指针所指向的内存单元的值;
-
结合性:自右向左:
-
单目运算符 & 和 * 的优先级比算术运算符的优先级高;
#include <stdio.h>
int main()
{
int i=100;
int j=110;
int *pointer_1,*pointer_2;//这里的*不是取值操作符,仅定义指针函数
pointer_1 = &i;
pointer_2 = &j;
printf("%d\n%d\n",*pointer_1,*pointer_2);
return 0;
- 以下是错误的赋值示范:
float a;
short *pointerr_1;
pointer_1 = &a;
- 将float型变量的地址放到指向整型变量的指针变量中
- 不同的编译器不同的数据类型所占字节不同,这里以GNU GCC编译器为例
- 所占字节不同导致结果输出错误
- 类型一定要对应! ! !
- 指针变量中只能存放地址(地址);
代码分析
举个例子:通过指针变量访问整型变量 还是上次举个例子
#include <stdio.h>
int main()
{
int a,b;(1)
int *pointer_1,*pointer_2;//(2)
a=100;b=10;
pointer_1 = &a;
pointer_2 = &b;(3)
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointer_1,*pointer_2);
return 0;
}
如果做了两遍还不理解代码为什么这么写,那跟我一起慢慢分析
大括号里的每一步我都会慢慢来分析,不会不要紧,哪里不懂可以私信我或者在评论区提出疑惑,希望可以互相交流,基本能秒回的那种
- 先定义整型函数 a,b;还有定义指针变量;
- 第二行的 * 不是取值运算符,而是仅用来定义指针变量,这个要注意; 再复习一点,指针变量一定要有明确的指向才能使用,那么在这里pointer_1还有pointer_2存放的都是地址;
- 下一步为 a,b 进行赋值;并且说明这两个指针变量指的地址是谁的;
- 不要忘了 & 这个符号是取地址运算符,如果不带则无法说明指向的是地址,而是值;
- 接下来就开始输出,正好可以验证你的代码有没有问题,或者哪一步的思路错了·,再重新写代码;
3.指针变量的初始化
一般格式
指针变量的初始化的一般格式: 数据类型 * 指针变量名 = 初始地址 例如:
#include <stdio.h>
int main()
{
int a=10;
int * pointer_1 = &a;
printer("%d\n",*pointer_1);
return 0;
}
- 这就是简单的指针变量的初始化一般格式,结果输出为10;
初始化的过程
- 在其过程中,系统按照定义的类型,在内存中为指针变量分配存储空间;同时把初始地址值存入指针变量的存储空间内;
- 如上个代码,指针变量的类型为 int ,整型变量,则在内存中存储4个字节;
空指针
- 概念:在声明中若无初始化地址,指针变量被初始化 “NULL”;
- NULL 由头文件 stdio.h定义为0,代表为空指针,用于指示指针不指向任何有效对象;
- 例如:
#include <stdio.h>
int main()
{
int a = 10;
int * pointer_1 = &a;
if (pointer_1 !=NULL)
printf("%d",*pointer_1);
return 0;
}
- 在这个代码中,如果指针变量不等于NULL,则输出指针变量指向的值;
- 则输出结果依旧是10;
初始化和空指针的区别
- 未初始化的指针可能与其他有效指针相等,也可能等于空指针;
4.野指针
定义
- 指针变量一定要有明确的指向,禁止使用未赋值或未初始化的指针变量;
- 野指针是指指针指向的位置是不可知的;
#include <stdio.h>
int main()
{
int *p;//定义一个指针变量,局部变量未初始化,里面默认放的是一个随机值
*p = 20;
return 0;
}
数组里只有10个数,从a0到a9,但是 i 是从0到12,那么从 i = 10时就不属于数组a的范围里了,这就叫越界访问;
- 当指针指向的超出数组a[10]的范围时,p就是野指针;
- 3.指针指向的空间释放
#include <stdio.h>
int *test()
{
in a =10;
return = &a;
}
int main()
{
int *p = test();
printf("%d\n",*p);
return 0;
}
如何规避野指针
- 指针初始化;
- 小心指针越界;
- 指针指向空间释放即使置NULL;
- 指针使用之前检查有效性;