到底什么是指针——c或c++或go中指针容易被混淆的罪魁祸首原因——看完任何新人都能懂

整个文章中示例代码段,为方便主要用c++写了,这种语言间共通的概念,就不要纠结语言本身了。

1.搞清指针相关的单词

指针:即某一块内存的地址。可以当做网络概念中的IP,就比较容易理解,因为人没法看懂也没法记住,比如0xc0000ac7b8。

普通变量:即指向某一块内存的地址的简称,或者叫别称。可以当做网络概念中的域名,就比较容易理解;

指针变量:不管怎么解释,最终它是变量,它是变量,它是变量!一个内存地址的简称或别称!这是关键!但是,他的内容比较特殊,存着的是另一块内存的地址。

2.搞清指针相关的符号

*     (第一种)

定义指针变量的符号!!!


只出现在定义或者初始化变量时!!!其他情况出现的,不是一个东西,虽然符号一样!!!

c/c++中的

// 定义一个指针变量
int* testKey;

go中的

var testKey *int

看清楚,它有两层意思,初始化时,指针是要紧跟数据类型后面(c/c++),紧跟数据类型前面(go)的!
意思是:1.它是一个指针变量,它这个变量的内存里,存的内容是一个指针,2.指针指向的内存里存的是一个int类型的值。

*     (第二种)

取 ( 值 ) 符号!!!
只有内存地址前面才能出现!!!
什么意思?
三个意思:
1. 这个符号后面不管跟着什么,一定会是内存地址,要不然会报错!
2. 后面跟着的,可能只是一个简单的指针变量,比如,*testVar,那testVar本身就必须是个指针变量,不能是普通变量。
3.1 但也可能是其他形式的内存地址,比如,**testVar,甚至***testVar,可以无限套娃,取值下去。
3.2 拿***testVar来解释,换个显示方式就是,*(**testVar),也就是说括号中的**testVar是一个内存地址,只有那样才能取值。
3.3 然后,再把**testVar换个显示方式就是,*(*testVar),也就是说*testVar也是一个内存地址。
3.4 所以,既然*testVar是个内存地址,就说明testVar这个变量就是个指针变量。
3.5 反推一下,***testVar,不管testVar前面有多少个*符号,testVar,必须是个指针变量,你玩的再花,也只能是个指针变量。
3.6 并且,你也只能是实现初始化时定义的数据类型,比如int
3.7 多个*符号的时候,从理解上有一个小技巧就是,有几个*,就代表,是第几个指向的内存的内容。两个*就是第二个内存的值,三个就是第三个内存的值。
3.8 不管你有多少个*符号,最终你是要取到比如int类型的值,因为仅内存地址从程序最终目的来说,没有任何实际意义。内存地址的存在意义就是为了取到最终的int值,当然根据最初的定义类型,也有可能是其他类型的值。之所以有玩的花的情况,是因为其他一些高级应用,比如链表,链表之间是要通过指针来连接起来的,而这个链表对于整个程序世界,可以说是举足轻重的作用,很重要!至于这些,新人从学习角度,了解一下就可以了,不需要深究。

来把两个*符号,对比看一下,以便印象深刻:

#include <iostream>

using namespace std;

int main() {
    int a = 10;            //普通变量初始化
    int* pa;               //int类型指针变量,定义。这里的*,是第一种,定义指针变量。
    pa = &a;               //给pa这个指针变量,赋值,值是&a,也就是a这个普通变量的内存地址
    cout << *pa << endl;   //这里就会输出10。这里的*,是第二种,取指针变量的内容(取值)。

    system("pause");

    return 0;
}

一定要分清楚 * 是有两种意义的,这就和我们 + 和 - 这两个符号一样。
比如:
-1,这时候的 - ,他不是减号,他是表示负数的符号。
2 - 1,这时候的 - ,他才是减号。
这两种情况下,虽然眼睛看到的符号是一样,但完全是两个东西。

&

取 ( 址 ) 符号!!!

这个就比较好理解了,因为它不能套娃,你不可能取一个内存地址,然后再取这个内存地址的地址,没有这种概念。

时间关系,先写到这里,后面我还有要补充的相关扩展内容,到时有空了再更新吧。

但对于新人来说,看到这里,就可以完全理解指针这个概念了,也不会凌乱了,也没必要继续深究。

学习知识,或者读书,一定不要抱着第一次就要完全理解,完全吸收的态度。任何人都不可能!!!而有些点,只有有了特定积累,甚至人生经历,才可能懂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值