对于初学者来说,是不是一提到指针,大家就头疼啊,哈哈哈,当然,它都这么“吓人”了,那么在C语言中扮演的角色也很重要,当然,它也是C语言中的一个特色,如果我们把它拿下的话,那么,在后面写代码的过程中,可以使程序简洁,紧凑,高效,换而言之,指针算得上是C语言的灵魂了吧!
既然这样,我们就完全吃透它,好不好~ 我们一个脚印一个脚印的走。
本篇文章文字内容较多,希望各位小伙伴么有耐心一点吆~
一.什么是指针?
如何理解呢:
简单来说,指针就是地址。(一直说指针就是地址,指针就是地址的,跟顺口溜一样,但却不了解它的真正含义。)
解释:
因为是通过地址能找到所需要的变量单元,也可以理解为,地址指向变量单元,比如说,你去住酒店,你房间的房间号是2509,如果你的朋友来找你玩,是不是根据你的房间号从而找到你啊,那么这个房间号就是房间的地址。换而言之也可以说,这个房间号指向了这个房间。内存亦是如此,将内存空间分割成一个个小的内存单元,并对它进行编号,这个编号就是地址,也称为"指针",意思是:通过它从而找到以它为地址的内存单元。看到这里的时候,你们是否对这个概念稍微清楚了一点呢?别着急,我们慢慢来.....
理解:
(1)指针变量就是用来存放地址的变量。(存放在指针中的值都被当成地址处理);
(2)指针变量里面存放的就是地址,通过这个地址,就可以找到与其相对应的内存单元;(地址是唯一标示一个内存单元的);
(3)指针的大小:
在x86环境(32位平台)是4个字节;
在x64环境(64位平台)是8个字节;
那内存空间的管理又是怎样理解呢?
因为计算机关于内存管理涉及太多知识点,这里暂时先不详细介绍了,那么,我就用通俗易懂的大白话给大家解释啦:
把内存单元切割,每个内存单元为1字节
==> 给每个内存单元进行编号,我们就把内存单元的编号称为地址
==>指针就是地址,地址就是编号,也可理解为,指针就是内存单元的编号。
比如说这段代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int m = 10;
int* p = &m;
return 0;
}
这里的m是整型变量,我们知道整型变量在C语言中占四个字节的内存空间;
这里的&m意思是通过&地址操作符,从而取出m的地址 ==》 &m就是m的地址;
int *p : 意思是初始化一个int*类型的指针p;
p = &m : 意思是将m的地址存入p指针,这时候p就表示为变量m的地址;
*p = m: 意思是指针p指向变量m,这时候*p就表示为变量m的数值。
二.指针类型
从语法的角度来看的话,你把在指针声明语句中的指针的名字抛开,剩余的其他部分其实就是这个指针的类型。
在C语言中,指针类型就是数据类型,其实也单单就是给编译器看的,和其他类型都是一样的。
double a ; int a ; short a ; float a......
这些是在前面所学到的,其实当给它们加上*时,它们就变成了新的类型。
double* a; int *a; short *a; float *a......
把这些类型就称为“指针类型”。
这里我们可以看到,指针的定义方式为:类型 + *。
之所以对每个问题有问题时,往往是对它相关的概念理不清楚。接下来,我对这些小概念进行简单的解释,希望对大家有帮助哦
(一)指针的值
什么是指针的值?指针的值就是指针本身存储的数值,这个值会被编译器当作一个地址,而不仅仅是一个数哦。对x86(32位)环境下来说, 因为32位程序中内存地址都是32位长,那么,所有类型的指针的值都是32位的整数。那么这里我们又要区分指针指向的类型和指针指向的内存区域这两个概念了,记住它们俩可不一样啊!!!
(二)指针指向的内存区域
指针指向的内存区是从该值的内存地址开始,长度为sizeof的一片内存区结束。所以,当某个指针的值为某某时,换言之,就是讲这个指针指向了以某某为首地址的一片内存区域;反过来,当说这个指针指向了某块内存区域时,其实就是指这个指针的值时这块内存的首地址。如果指针指向的内存没有初始化,那么内存区域中所保存的就是无用数据,和变量定义后不赋值就是无用值类似。
(三)指针指向的类型
当你通过指针来访问指针所指向的内存区时,指针所指向的类型就已经决定了,编译器就会把那片内存区域中的内容当作某某来看。
所以在以后,我们遇到指针的时候,首先不应该是恐惧,而是应该考虑考虑,这个指针的类型,指针所指向的类型以及指针指向了哪里等问题,或许,当你把它们想清楚,你就在不知不觉中懂了,关于指针的这两个问题先分享到这里啦, 关于指针的其他问题,下期我们再见哦~