指针入门,这一篇文章应该就够了。如有错误或不足,还望多多指正。
下面这个链接是博主录的讲解视频,本文配合视频食用更佳哦
文章目录
一、 基本概念
1.1 地址
地址
:这里以int类型为例,
因为一个int类型4个字节Byte(32位和64位机器中)
所以可以简单理解为这个int占了四个绿色小方框。
那么此时,这个int变量的地址就是1000,即第一个绿色小方框右边的数字。
即就是:这个绿色方框在内存中所处的位置。
1.2 指针
指针
:还是这个例子
那
指针
就是一个变量
,比如这个变量名就叫p
吧。
那这个p是个啥东西呢?
把这个1000存到p里去,即,把int类型变量a的地址存进新的变量p中。
那么p这个变量就是一个指向a的指针。
通俗理解下就是:
小明是个舔狗,喜欢小a,但是他比较害羞,不敢直接找小a。
所以小明就找到了小p。为什么找小p呢,因为小p有小a家的地址。
这样小明就可以把给小a送的东西放小a家门口了。这里的小a和小p就相当于例子中的int类型的a变量和指向a的指针p。
我只要找到了p就相当于找到了a
1.3 为什么要使用指针这个东西呢
首先我们要明白一直知识点:
需要说明一下的是指针类型存储的是所指向变量的地址:
所以32位机器只需要32bit,而64位机器需要 64bit
由此可知,在一台电脑上,所有指针大小都是一样的。
那么,当我们定义了一些非常复杂庞大的结构体,比如这个结构体有50个字节(Byte)。
这时候,向函数中传入参数的时候,是直接把这个50个字节的数据的副本传递到形参上快?
还是,直接传递32bit或者64bit的指针快呢??
很明显,传入指针可以大大大大提高运算的效率。
1.4 指针变量的定义
刚才说了,指针变量是来保存别的变量地址的一种变量。那该如何定义呢?
如何让计算机一眼认出来这一串数字是地址,而不是普通的数字呢?
基本格式:
基本类型 *指针变量名 = &变量名;
(也可以先省略=后面的内容,先只定义,不赋值,但是还是建议定义的时候就进行赋值)
//定义变量:
int a = 666;
char b = 'b';
//定义指针变量:
//1.告诉计算机这是一个保存int类型数据地址的指针变量
int *pa = &a;
//2.告诉计算机这是一个保存char字符类型数据地址的指针变量
char *pb= &b;
上面的代码,我定义了两个指针变量,一个是p
一个是p2
。
看见了两个奇怪的符号*
和&
1.4.1 *
这个符号,为取值运算符
啥是取值运算符呢?
就是,我现在有了指针,指针里存的是一个变量的地址,
我现在要通过地址取到这个变量的值。注意:指针里存的是地址,就是通过这个地址找到这个地址住的谁。
举例
比如上面的代码中,pa这个变量存的是a的地址,变量a中存的是666。
那么*pa就可以相当于666。
所以可以明确一点。取值运算符会和指针变量连用。
为啥呢?
因为我们要通过地址取地址所指向的变量中存放的值呀!
如果还不明白没关系,在说完&后我对上面的代码解释说明一下。
一个概念:野指针
先看下面代码
#include <stdio.h>
int main(void){
int *p;
*p = 10;
return 0;
}
这里我们首先定义了一个int类型的指针p,当然,这个p里面保存的是个地址,且这个地址所对应的存储空间只能存int数据,所以叫做int类型的指针。
注意