数据结构知识基础之指针

  对于很多学习过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。

  以上就是我对基本类型指针的理解,如果有错误的地方也请大家指正,不胜感激!

此篇博客属于博主原创,如果转载请标明出处,谢谢。

时间: 2024-12-18 22:09:46

数据结构知识基础之指针的相关文章

c++基础知识篇:指针

从面试的反馈来看,这部分可以问的很难. 1.指针与引用的区别 指针是一个变量,用来存放地址的变量.引用是原来变量的存储空间的别名. ? 2.指针作为参数的要点 a.需要进行指针的合法性检验,防止空指针. b.需要修改指针本身指向的地址时,参数需要是该指针的引用. ? 3.c++程序运行空间 数据区(Data Area):全局变量.静态变量.常量存放在数据区. 代码区(Code Area):所有类成员函数和非成员函数 栈区(Stack Area):为运行函数分配的局部变量.函数参数.返回数据.返回

用python处理文本,本地文件系统以及使用数据库的知识基础

主要是想通过python之流的脚本语言来进行文件系统的遍历,处理文本以及使用简易数据库的操作. 本文基于陈皓的:<程序员技术练级攻略> 一.Python csv 对于电子表格和数据库导出文件,比较常见的文件格式是.csv,所以python中的csv模块也是一个比较重要的模块.下面介绍csv常用的方法. 1.csv.reader(csvfile, dialect='excel', **fmtparams) 该函数返回一个reader对象,能够以行遍历的形式遍历行里面的数据. csvfile——需

JavaScript 面向对象开发知识基础总结

JavaScript 面向对象开发知识基础总结 最近看了两本书,书中有些内容对自己还是很新的,有些内容是之前自己理解不够深的,所以拿出来总结一下,这两本书的名字如下: JavaScript 面向对象精要 JavaScript 启示录 如果对于 JavaScript 面向对象编程理解不够深的话,第一本书还是强烈推荐的.第二本书比较适合初中级的开发者阅读.对各种知识点都有代码示例.内容中规中矩. 1.JavaScript 中的变量类型和类型检测 C#和Java等编程语言用栈存储原始类型,用堆存储引用

数据结构【基础知识点总结】

数据结构[基础知识点总结] 一.数据 数据(Data)是信息的载体,它能够被计算机识别.存储和加工处理.它是计算机程序加工的原料,应用程序处理各种各样的数据. 计算机科学中,所谓数据就是计算机加工处理的对象,它可以是数值数据,也可以是非数值数据.数值数据是一些整数.实数或复数,主要用于工程计算.科学计算和商务处理等: 非数值数据包括字符.文字.图形.图像.语音等. 二.数据元素 数据元素(Data Element)是数据的基本单位.在不同的条件下,数据元素又可称为元素.结点.顶点.记录等.例如,

【C++基础】指针好难啊,一点点啃——基本概念

指针保存的是另一个对象的地址(概念真的很重要!!) int a=1; int *ptr = &a;//*定义一个指向int类型的指针ptr, &a取变量a的地址 一.指针的初始化 几个概念,迷途指针==野指针==悬浮(dangling)指针==失控指针 当对一个指针delete后,会释放原来的内存,但指针变量名依然存在,值却没有设置为NULL或0,这就相当于声明一个指针时没有初始化, 当再次使用该指针时,则会出现严重错误(崩溃是肯定的,本人还没体会到多严重),以上是我的理解 原则:不能使用

指针知识梳理7- 函数指针

一.函数的地址 前面讲 程序运行起来以后,在内存中有代码区,程序运行每一条指令,是从内存中读出来这条指令,然后再运行. 所谓函数的地址是指函数的入口地址,这个函数的从这个地址開始进入运行,也就是从这个地址处取指令运行. 那么在代码层面,函数的地址用 函数指针变量 来存储. 二.基本使用 1.函数指针定义 函数指针的定义,在语法看起来略微有点怪,仅仅须要记住形式 返回值 (*指针变量名)(形參类型): 比方,下面4个函数 void func1(void) { } int func2(void) {

【C++基础】 指针&amp;字符串&amp;数组

先贴代码,总结以后再写,和5中内存分配方式密切相关 PS: str 返回整个字符串,str[0],*str返回首字符h char *strA(){ char str[]="hello!"; //局部数组,局部变量, str存在栈区 return str; //局部变量不能传值,估计会成为野指针 //函数返回局部变量的地址,当被调用完成时,str就释放了,因此返回结果是不确定的且不安全的 } char *strA2(){ char *str = "hello2!";/

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

java在线聊天项目 实现基本聊天功能后补充的其他功能详细需求分析 及所需要掌握的Java知识基础

补充聊天项目功能,做如下需求分析: 梳理项目开发所需的必要Java知识基础 GUI将使用更快速的swt实现 SWT(Standard Widget Toolkit) Standard Widget Toolkit是一个开源的GUI编程框架,与AWT/Swing有相似的用处,著名的开源IDE-eclipse就是用SWT开发的. 在SWT之前,Sun已经提供了一个跨平台GUI开发工具包就是AWT (Abstract Windowing Toolkit). swt开发包下载地址 链接: https:/