数据结构知识基础之指针
Posted hiyanxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构知识基础之指针相关的知识,希望对你有一定的参考价值。
对于很多学习过c语言的同志们来说都知道指针是c语言中最最精粹的地方。就拿我现在主攻的php语言来说,php这种动态脚本语言底层也是用c来实现的,当我们实例化一个对象时,其实真正的过程也是一个在栈内存中的地址指向堆内存中真正的对象的过程,也就是说真正的对象时放在堆内存中,栈内存中放的是指向堆内存中对象的地址,PHP就是通过这种地址的指向实现了一个对象实例化的过程。上面插了一点,现在就来说说指针和地址的定义。
地址:地址就是内存单元中的编号,是一个从0开始的非负整数,范围和我们的内存有关,若我们的内存是4G,则地址范围就是0-4G-1。
指针:在c语言中,指针是一种类型,被称为“指针类型”,描述的地址。简单的说指针就是地址,地址就是指针,指针变量是存放内存单元地址的变量,本质是一个操作受限的非负整数。
下面就来简单的说一下基本类型的指针。
我废话就不多说了,直接上代码:
1 #include <stdio.h> 2 3 int main(void){ 4 5 int *p; 6 int i=10; 7 int j; 8 9 return; 10 }
以上是一段基本的c语言的代码,从上面的代码中我们定义了几个变量,先从简单的说,定义一个i变量,且赋值为10,定义了一个j变量,我们没有赋值。
剩下的int *p就是重点了,这个该怎么理解呢?就我自己的理解而言,我是这样理解的,我们看见*号,我们就知道p是一个指针变量,存储的是地址,前面的int表示的是该指针变量p只能存储int类型的数据的地址。
所以就以上解释,我们就知道了,int *p其实是一个指针变量,该指针变量只能存储int类型的数据的地址。
接着看下面一段代码:
1 #include <stdio.h> 2 3 int main(int argc, char *argv[]) 4 { 5 int *p; 6 int i=10; 7 int j; 8 9 p=&i; 10 j=*p; 11 printf("j=%d ",j); 12 13 14 15 16 return 0; 17 }
在上面这段代码中,我们又添加了3行代码,其中printf()是输出函数,这个不用解释。p=&i这行代码的含义是什么呢?通过上面的解释我们都知道了p其实是一个存储int类型的地址的指针变量,本着只有相同类型的变量才能互相赋值的原则,我们也可以知道&i也应该是一个地址。其实就是这样的,“&”这个符号的含义就是取地址的含义,通过这个符号我们就得到了i变量的地址。
下一行,j=*p,这行代码也是一个赋值的代码,根据向左赋值的原则,我们知道*p也是一个int类型的变量,在c语言中*p的作用就是获取p变量所指向的变量,所以*p其实就是i变量,因为i变量为10,所以,j变量输出也是10。下图是代码的运行结果:
我们再从下图中从另一个方向理解:
从上图我们可以看出,在内存中变量的地址时不连续的,是由地址总线随机分配的,因为p是一个指针变量,并且通过取地址的操作,指向了i变量,所以p指针变量存储的是2000H,即i变量的地址。*p则表示为i变量,通过对j变量赋值,使得j变量成为了10。
再说一个比较有意思的事情,接着看代码:
1 #include <stdio.h> 2 3 4 int haha(int *p){ 5 *p=100; 6 } 7 8 int main(int argc, char *argv[]) 9 { 10 int *p; 11 int i=10; 12 int j; 13 14 //p=&i; 15 //j=*p; 16 //printf("j=%d ",j); 17 haha(&i); 18 printf("i=%d",i); 19 20 21 22 return 0; 23 }
上图中,我们定义了一个haha()函数,其中形参是一个指向int类型的指针变量p,记住:我们的形参是一个地址。所以,在我们调用时,我们应该传入一个地址,所以我们传入了&i,是i变量的地址。通过我们上面的讲解,大家也应该知道了最终的输出结果,没错就是100:
通过上面的学习,我们也会知道,其实在我们传参时传入的是一个地址,所以,此时直接指向的是我们的变量,当我们在操作时,即赋值是,直接对地址指向的变量赋值,所以我们就已经改变了原变量i的值,所以我们在输出时输出的就是100。
以上就是我对基本类型指针的理解,如果有错误的地方也请大家指正,不胜感激!
此篇博客属于博主原创,如果转载请标明出处,谢谢。
以上是关于数据结构知识基础之指针的主要内容,如果未能解决你的问题,请参考以下文章