C和指针 (面向小白)

在这里强烈安利一篇文章------->这是大佬的文章

我这里面要写的基本上就是这篇文章的解释和摘要,可能比较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()的方式,这里暂时就不在展开讲了。

猜你喜欢

转载自blog.csdn.net/qq_39760343/article/details/83055697