C语言-入门级别指针详解(上)
写在前面
指针是C语言的核心部分,可以说的C语言的灵魂所在。由于内容有一点点多,故此会分为上下两篇发布。这次Yu同学给大家带来的是初识指针上篇,让大家浅显的了解一下指针的一些知识。
开始之前说明一下什么是地址:
内存可以看成大量的小空间,每一个小空间都会有一个编号,而这个编号我们称之为地址。
1.指针与指针变量
1.1 变量在内存中的储存
在程序钟定义了一个变量a,则在编译时系统就会在内存中给变量a分配一个地址,这个变量的地址就称为该变量的指针。
1.2 指针变量的概念
指针变量: 一个变量的内容是另一个变量的地址。
如果一个变量包含了另一个变量的地址,则称为第一个变量指向第二个变量的地址。
总结:指针是地址,指针变量是存放地址的变量(平常我们说的指针通常情况下是指针变量,大家了解下就行了)。
2.指针变量
2.1 指针变量的声明
数据类型 * 变量名;
这是声明当然也可以直接初始化,形式如下:
数据类型 *变量名=& 变量;
数据类型:指针指向的变量的数据类型,如:char *类型的指针是为了存放 char 类型变量的地址。
“ * ”符号:表示该变量是指针变量
注:变量名是不带*的,变量的类型是 数据类型 *。
代码:
int a=0;//声明一个变量
int *poniter=&a; //将a的地址放到pointer中
2.2 取地址运算符和解引用运算符
-
取地址运算符
取地址运算符符号为“ & ”,作用是获取变量的地址。
如:pointer=&a;
就是把a的地址赋值给pointer变量。 -
解引用运算符
解引用运算符符号为“ * ”,作用是返回一个地址中存储的数据。
如:
int main()
{
int a;
int* p = &a;//这里的*不是解引用运算符,只是一个标志
//这里是把a的地址放到指针变量p中
printf("%d\n", a); //打印a的值
printf("%p\n", &a); //打印a的地址
printf("%d\n", *&a); //打印a的地址所储存的值(就是a自己)
printf("%p\n", p); //打印p中的值
printf("%p\n", &p); //打印p的地址
}
结果如下:
2.3通过指针来更改变量的值
这是指针基本的用法,其实就是用*和&这两运算符完成的,跟上面讲的又一点点重复,这里就用代码给大家讲解一下简单的例子:
int main()
{
int a = 0;
int* p = &a;
*p = 3;
printf("a=%d\n", a);
printf("*p=%d\n", *p);
return 0;
}
这里并没有对a直接赋值但却改变了a的值关键语句是*p=3;
,其中p=&a,故*p=3等价于 *(&a)=3,就是a=3的意思。
3.指针运算
前面讲过指针是地址,而地址是十六进制的整数,是整形那就可以运算,这里给大家介绍一下指针的运算。
3.1指针与整数间的运算
指针与整数的相加是地址与整数相加,可以整数的大小来确定地址的变化量。
代码举例:
int main()
{
int a = 0;
int* p = &a;
printf("更改前:\n");
printf( " p 的值(16进制的形式)=%p\n", p);
printf(" p 中地址所对应的值(10进制)=%d\n", *p);
printf(" p 自己的地址(16进制)=%p\n", &p);
p = p + 1;
printf("更改后:\n");
printf(" p 的值(16进制的形式)=%p\n", p);
printf(" p 中地址所对应的值(10进制)=%d\n", *p);
printf(" p 自己的地址(16进制)=%p\n", &p);
}
我们可以看到p只加了1就出现了以上的差别,下面我们来一个一个的看:
- p中的值(这个值是a的地址)由0076FCEO 变成了0076FCE4,大小增加了4。
系统中每一块内存都有一个地址,这一小块的内存大小是 1 字节,这里加的1是整形,也就是说p+1的地址在p的后面4个。 (跟加的变量的数据类型有关,比如如果加的是char型,则没增加一个单位地址增加2)
- 指针变量指向变量的值的大小
上面p中地址对应的值(这里就是a)为0,而p+1指向的值却是-858993460,这个值的大小是随机数,因为道地址之间的差和地址中的值是没有啥关系的。
3.2指针间的运算
其实这点和第一点几乎是一样的。指针是地址,而地址是一个整形,指针间的运算就相当于指针和整形运算,唯一的区别的指针指向的是一个已经确定的随机数,这时候相加就没太大意义。
4.野指针
野指针是指指针指向的地址是未知的,既可能是指向已近使用的空间又有可能指向已近使用的空间,野指针一般引出大问题的是后者,因为指正是可以略过变量名之间改变变量中的值 ,比如你写的一个野指针修改的值刚好是switch()中的整形变量,那这一部分的功能就都会失效。
总结:
本次Yu同学给大家介绍了指针的概念,声明方法,简单解释了指针的使用方式和原理,希望能帮助大家快速了解指针.
写在最后
非常感谢大伙们的耐心阅读(如果内容还可以的话能不能给个小心心鼓励一下YU同学),如果对内容有不明白的可以在评论区直接提问,如果是文章有错误的也还请大佬们指导一番,谢谢大家,这段时间我们一起努力吧,YU同学一定会和大家一起进步的!加油,追梦人!