在这里强烈安利一篇文章------->这是大佬的文章
我这里面要写的基本上就是这篇文章的解释和摘要,可能比较sh,再适合小白吧,另外膜拜大神。
由于输入输出的原因这里采用的是C++的cin 和 cout进行输出
现在我们要通过案例来学习指针看第一个例子:
#include<bits/stdc++.h>
using namespace std;
int main(){
int *ptr;
int a[]={11,22,33,44};
ptr=a;//数组去掉中括号代表数组首元素的地址,
//又因为数组属于线性表所以他们之间的元素存储是连续的,
//因此首元素地址甲乙就是下一个元素的地址
printf("%d",*ptr);
}
那么我们看一下这个程序的逻辑,首先就是我们定义了一个指针型变量 这个变量的名字叫做ptr,注意这一点很重要!!!
我们定义的并不是*ptr而是ptr这个变量,*和int都是用来说明ptr的类型的,其中*代表指针,int代表ptr指向的是是整形变量,另外我们所说的指针,是说的ptr不是*ptr,*叫做间接寻址运算符,ptr才是真正存储地址的变量,好,了解到这我们继续。
在数组的定义中我们规定数组名就是它的首地址,因此当我们去掉*号之后,就可以使用ptr指向地址了,然后我们可以使用*ptr的方式,找到ptr所指向内存的存储内容,然后进行输出。
好的,如果你上面的文章都看明白了,那么我们接下来要讲的,理解起来也同样很简单。
实例二
#include<bits/stdc++.h>
using namespace std;
int main(){
int *ptr;
int a[]={11,22,33,44};
ptr=a;
cout<<*ptr<<endl;
ptr++;
cout<<*ptr<<endl;
(*ptr)++;
cout<<a[1]<<endl;
}
输出结果如下所示:
11
22
23
这里面最有意思就是(*ptr)++,操作竟然影响了原数组,那么为什么呢?
我们前文是不是说过我们是把数组的地址给了指针变量ptr因此我对ptr指向的地址的数据做操作,实际上也就是相当于我对a数组存储的数值做操作,因此我们实现了通过ptr对数组a进行了更改。
PS:这里有必要提及一下,在Linux上C是不能直接对物理地址做操作的,他是对虚拟地址做操作然后在映射到物理地址上去,要说有什么用,笔者愚钝,只知道应该是为了安全考虑才这样做的,并没有仔细深究,因此,这里暂且就当做一个讨论题目吧,有兴趣的同仁欢迎私信或留言。
对于C语言来说“=”代表的含义是把数值赋值过去,但是如果有一方是地址型变量呢?
我们来看这样一个问题:
#include<bits/stdc++.h>
using namespace std;
int main(){
int b=1;
int &a=b;
cout<<a<<endl;;
a=4;
cout<<b<<endl;
}
答案是什么呢?
====================================================
答案是 :
1
4
这个地方a叫做b的引用,他们实现的原理上文一样,这里供大家独立思考一下。
PS:在这里有必要提及一下对于python这个语言来讲,他的列表类型的赋值,默认就是生成的引用。而打破这一问题的方法在于采用b=a.copy()的方式,这里暂时就不在展开讲了。