- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
1. 普通指针
什么是普通指针,普通指针就是指向基本数据类型的指针,比如int 、float等。
1.1 指针的定义
我认为实战是最好的理解方式,所以会有代码以及注释详细理解,不过在你看代码之前,你应该知道这些东西:
- 如何定义一个指针
- 如何给指针赋值
- 给指针赋值后,怎么使用原变量的值
就和定义一个普通变量一样:类型 *变量名
指针变量接收的是变量的内存地址在C语言中,通过符号&来取出变量的内存地址
赋值也是同样的
1.2 指针实例理解
那么你知道了这些知识后,就看代码:
#include<stdio.h>
int main()
{
int num = 10;
// 创建一个int类型的变量,并赋值为10
int* pnum;
// 创建一个int类型的指针,你还能这样写 int *pnum
pnum = #
// &num是num在内存空间的内存地址
// 这句代码是将num的内存地址赋值给pnum
printf("num的值为:%d\n&num的值为:%p\n*pnum的值为:%d\npnum的值为:%p",num,&num,*pnum,pnum);
// 将各个值都打印出来看看效果
return 0;
}
运行结果是:
num的值为:10
&num的值为:0xff8effe0
*pnum的值为:10
pnum的值为:0xff8effe0
1.3 头脑风暴
看了这段代码,是不是对指针有了更深刻的了解了呢?
如果你想学好,就暂停你的进度,思考一下:
- pnum是什么,他开辟的内存空间是多大
- *pnum是什么,有什么用
- &pnum是什么,他的作用是什么
思考之后来看看吧~~
那么我们看着代码和运行结果可以总结出以下内容:
接下来,你就想想你,你的身份证号,你的身份证,国家信息系统
num是一个变量,这个变量可以对10进行操作
- 将10当成你,num是你的名字
- 声明一个变量后,内存空间会为变量开辟一个内存空间以及内存地址
- 而你出生后也会有一个身份证号
&num是变量的内存地址,这里&num虽然是内存地址,但是不说&num是num的指针,因为指针是一个变量,俗称指针变量
- num在内存的内存地址相当于你的身份证号
- 你的身份证号只是一串数组,抽象存在
pnun是一个指针变量,他的值是是&num,也就是一个普通变量的内存地址
- 把它当成你的身份证
- 你的身份账号在上面,就可以通过身份证号(指针)进行操作(买票,办卡等)
*pnum是通过内存地址获取到该内存地址存储的值
- 就是通过你的身份证在国家系统找到了你
- 也可以对你进行操作(比如征信,车票等)
1.4 头脑风暴(二)
试想,你如果声明一个变量,并将该指针变量的内存地址给该指针,也就是让指针变量存储的是指针的内存空间,会有什么事情发生?
思考:我们的指针变量是一个存储内存地址的指针,但他同样也还是一个变量,所以也会在内存中有自己的内存地址,而刚好指针存储的就是变量!!等等等等,一拍即合,我们就把指针的内存赋给指针,看看会发生什么!
上代码:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int * p;
p = &p;
printf("p=%p\n&p=%p\n*p=%p",p,&p,*p);
return 0;
}
编译结果:
p=0xfff75af4
&p=0xfff75afc
*p=0x0
哦豁,结果清晰可见,我们也因此产生了一些疑惑,为什么会出现两个内存地址呢?
来看看昨晚我与大佬的对话吧~~
但是当时还是很疑惑为什么会出现了两个内存地址~~
第二天找到了原因!
昨天是使用手机敲得C代码,因为那时候还在火车上,没法拿电脑
今天使用了电脑,编译器是gcc,编辑器是vs code
重新编译了一下
运行结果如下:
p=0061FECC
&p=0061FECC
*p=0061FECC
欸,这就很舒服了,内存地址是一样的,所以虽然安卓有C语言的编译器,但还是使用电脑吧。