`
hqs7636
  • 浏览: 220956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C指针的实质(我的认识)

阅读更多



      最近对C/C++指针特别感冒,就详细的研究了下
      看下面的定义:
  
      char a[] = "Hello World";
      char *p   = "Hello World";

      1.什么是地址

      地址本身就是一种基本数据类型,它跟整数,浮点数,字符等基本类型是一样的。指针不是类型,真正的类型是地址,指针只不过是存储地址这种数据类型的变量。

    打个比方,对于
    int i=10;
    10是整数,而i是存储整数的变量,指针就好比这个i,地址就好比那个10。指针能够进行加减法,原因并不是因为它是指针,加减法则不是属于指针这种变量的,而是地址这种数据类型的本能,正是因为地址具有加减的能力,所以才使指针作为存放地址的变量能够进行加减运算。这跟整数变量因为整数能够进行加减乘除因而它也能进行加减乘除一个道理。

    2.什么是指针
      指针本身就是一个变量,它跟其他的变量是一样的。指针本身是一个符号。
    比如 int *p,我们定义了一个指针p,编译器就会在内存分配一个2(32位系统是4个字节)字节的存储空间。我们在使用p的时候,p的值就是刚刚所分配的存储空间中所存的内容。再来看看变量,我们定义int a = 10,a是一个变量名。我们在使用a的时候,用的是a所对应的存储空间的内容。a本身可以理解为就是一个符号,它跟某个存储空间相对应。&a就是取a所对应的存储空间的地址。这样,指针也是变量,本身也是一个符号,在使用p的时候,我们使用的是p这个变量所对应的存储空间的内容,而这个存储空间的内容有些特别,它不是整数,也不是浮点数,而是一个地址类型的数据。那么&p是什么意义呢,&p就是指p所对应的存储空间的地址(这个地址可不是p所对应的存储空间的内容哦)。那么*p怎么理解呢?记住在使用时,p的值是所对应的存储空间的内容,那么*p自然就是取出那个地址所对应的存储空间的内容了。

      3.什么是数组名

      数组名:就是一个数,这个数和整数,浮点数类似,是一个地址类型的数据。就像int a = 10;这里的10就是一个整数,它跟地址类型数据属于一个层次。也就是说数组名跟整数10是相似的,而跟a差距大多了,根本不是一个概念.应该说数组名与&a是一样的,都是一个地址数据,同时数组名还是一个常量常量,地址常量。

      用来存放数组的区域是一块在栈中静态分配的内存(非static),而数组名是这块内存的代表,它被定义为这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量类似,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址,这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,因此它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不会是左值,那么,数组名永远都不会是指针!

    4.再来讨论开头我们所定义的字符数组和字符串指针的区别

      我们假定这两个定义是在同一个函数中的(如main)。

      继续:*(a+1) =u;                                               

           *(p+1) = u

      这里第一个操作会通过,而第二个操作则会出现段错误。这是什么原因呢?那么我们需要了解下,程序空间分配中存储区问题。C/C++程序所对应的存储区,分位三类

    1.静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间 都存在。它主要存放静态数据、全局数据和常量。
    2.栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束 时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
    3.堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。

    这里char a[] = "Hello World",其空间是分配在栈中的,所以你可以对其中的内容进行修改。而char *p = “Hello World”,其空间是分配在静态存储区的。且Hello world为字符串常量,是不允许修改的。

分享到:
评论

相关推荐

    指针重点难点的解析,教你如何认识指针

    指针是C语言乃至许多其他编程语言中的一个核心概念,它是理解高级程序设计的关键。本文将深入探讨指针的定义、工作原理...通过深入研究《C指针.pdf》这份文档,你可以进一步提升对指针的理解,为你的编程技能添砖加瓦。

    C语言教程\如何透彻理解C语言中指针的概念

    ### C语言中指针的概念详解 #### 一、引言 C语言作为一种强大的编程语言,在计算机科学领域占有举足轻重的地位。...希望本文能够帮助读者建立起对C语言指针的清晰认识,并在实际开发中灵活运用这一强大的工具。

    函数指针和指针函数,const的用法,指针常量,常量指针的用法

    ### 函数指针和指针函数的区分及应用 #### 函数指针的理解与使用...通过以上介绍,我们可以看出函数指针和指针函数有着本质的区别,同时正确使用 `const` 可以帮助我们更好地控制程序的行为,提高程序的安全性和效率。

    C语言中指针变量的教学探讨.pdf

    使学生避免过多地去考虑内存结构等专业知识,直接认识该指针变量的本质。 指针变量的分类包括简单变量、指针变量、一维数组变量等。在教学中,笔者对指针变量的形式做了介绍,强调了地址和值的关系。例如,指针变量...

    C语言中的指针教学探索.pdf

    为了更好地掌握指针的使用,首先要对计算机的存储机制有一个清晰的认识。 计算机的存储机制涉及数据在内存中的存储方式。内存由一系列字节组成,每个字节有唯一的地址用来标识。在C语言中,不同数据类型占用的字节...

    数组与指针的艺术 pdf

    通过本文档的深入探讨,我们可以更加清楚地认识到数组与指针的区别及其正确使用方式。虽然指针提供了强大的功能,但其复杂性也可能导致错误的发生。因此,对于程序员而言,深刻理解指针和数组的工作原理是非常必要的...

    再再论指针 pdf格式 电子书 下载

    在C语言中,数组与指针有着密切的联系,但二者之间存在本质的区别。 1. **数组名不是指针**:这是一个常见的误区。数组名实际上是数组第一个元素的地址,但它本身并不具备指针的所有特性。例如,数组名不能被赋值给...

    让你彻底搞定C指针

    在深入探讨C指针之前,我们首先要理解C语言中“变量”的存储实质。这有助于我们更好地理解指针的概念。 **1.1 内存空间与编址** 内存是计算机用来存储数据的地方。想象一下电影院的座位,每个座位都有一个唯一的...

    再再论指针

    本文旨在深入探讨指针的基本概念以及常见的理解误区,帮助读者建立起对指针更准确的认识。 #### 什么是数组名? 首先,我们需要澄清一个广泛存在的误解——数组名不是指针。虽然在很多场合下,数组名的表现类似于...

    项目九 使用指针.ppt

    首先,【认识指针】,我们要知道指针本质上是内存地址的别名。当我们声明一个变量时,编译器会为其分配内存空间,每个内存单元都有一个唯一的地址。例如,如果声明了两个整型变量`i`和`j`,它们在内存中会有相应的...

    c语言实战100例,含源代码

    实践中遇到的问题和解决方法会加深你对C语言本质的认识,而注释的添加则有助于你更好地理解代码逻辑。这些实战例子是学习C语言不可或缺的一部分,将理论知识转化为实践经验,是成为一名优秀的C程序员的关键步骤。

    浅谈C语言中函数形参为地址类型的定义形式和类型自动转换.pdf

    在学习和应用C语言时,理解这些地址类型参数的本质和特性是十分重要的,它不仅能够帮助我们编写出更加高效和安全的代码,还能够让我们对C语言的类型系统有一个更深入的认识。通过本文的研究,我们可以总结出,无论是...

    c语言 学习笔记part_1

    【C语言学习笔记part_1】是吉林大学讲师编写的C语言教程,旨在帮助初学者系统地掌握这门基础编程语言。...通过这些知识点的学习,读者能够逐步构建起对C语言的基本认识,为进一步深入学习打下坚实基础。

    C语言练习题 C语言入门

    C语言是一种广泛应用于系统编程、应用编程、嵌入式开发等多个领域的高级编程语言。它以其简洁、高效的特点深受程序员...在实践中,不断解决各种问题,将有助于深化对C语言本质的认识,为后续的进阶学习打下坚实基础。

    指针对学习Java语言的价值.pdf

    通过将Java的引用与C++的指针进行类比,可以帮助我们更好地把握引用类型变量的实质,即它们是对象的“指针”,存储了对象在内存中的位置,而不是对象本身。 总之,虽然Java语言设计时避免了指针的使用,但通过理解...

    最好的C语言专家编程

    通过实例和实践,读者将学会如何有效管理程序内存,理解指针的本质,以及如何利用指针进行高效的数据操作。同时,书中还特别讨论了避免内存泄漏和指针错误的策略,这对于编写健壮的C程序至关重要。 接着,书中涵盖...

    c语言编译器源码(dos)

    在这个“C语言编译器源码(DOS)”的压缩包中,包含的是一份适用于DOS操作系统的Small C编译器的源代码。对于学习编译原理、C语言底层工作方式以及软件开发过程的开发者来说,这是一个非常宝贵的资源。 1. **编译器...

    C语言面试题大汇总(pdf版)

    1. 指针:理解指针的本质,学习声明、初始化、解引用操作,以及指针与数组、函数、字符串的交互。 2. 内存管理:了解堆栈和堆的区别,理解malloc和free函数在动态内存分配中的作用。 三、数组与字符串 1. 数组:...

Global site tag (gtag.js) - Google Analytics