`

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语言指针的底层原理.pdf

    C语言指针操作的优点在于它能够提高程序的运行效率,尤其是在涉及到大型数据结构如数组、字符串等传递时,可以避免复制整个数据结构而仅仅传递一个地址,极大减少了数据传递的开销。此外,指针还能够实现动态内存...

    C语言指针大全+指针实例解析

    C语言中的指针是其强大的特性之一,也是学习C语言时不可或缺的重要部分。指针可以被视为内存地址的别名,允许我们直接操作内存,从而实现高效...同时,理解指针的底层工作原理有助于更好地避免编程陷阱,提高代码质量。

    深入理解C语言指针的奥秘 C和C++中函数指针的含义(上).pdf

    然而,无论在哪个语言中,理解函数指针的本质对于深入学习高级编程概念都是非常有价值的。 总结来说,函数指针是C和C++语言中非常重要的概念,它为程序提供了强大的功能和灵活性。通过合理地使用函数指针,程序员...

    C指针 C指针C指针C指针C指针C指针

    C指针是C语言中的核心概念,它是编程中不可或缺的一部分,尤其对于理解内存管理和程序设计的底层机制至关重要。本文将深入探讨C指针的基本概念、使用方法及其在程序设计中的重要性。 首先,理解C指针的基本定义是...

    深入理解C语言指针的奥秘

    本文将深入探讨C语言指针的奥秘,帮助读者从基础到高级,全面掌握指针的使用技巧。 一、指针的定义与类型 指针在C语言中被定义为存储地址的变量,它持有其他变量的内存地址。指针变量有自己的数据类型,例如`int *...

    C语言指针和汇编语言间接寻址的关系探讨_从存储空间图的视角加以分析.

    在探讨C语言指针与汇编语言间接寻址的关系时,我们从存储空间图的视角出发,这不仅能帮助我们更直观地理解这两种编程语言中数据访问机制的本质,还能揭示它们之间深层次的联系。 ### 存储空间图的概念 存储空间图...

    让你不再害怕C语言指针

    总之,掌握C语言指针的关键在于理解它们的本质——内存地址的载体。通过实践和理解指针的基本操作,你将能够克服对指针的恐惧,进一步提升C语言编程的能力。阅读提供的“让你不再害怕指针.pdf”文档,相信你会有更...

    C语言 指针学习 C语言C语言C语言

    本文将深入探讨C语言中的指针,帮助学习者理解其本质和应用。 一、指针的概念 在C语言中,指针是一个变量,它存储的是另一个变量的地址。这个地址相当于内存中的位置,通过指针,我们可以间接访问和修改存储在该...

    c语言指针学习的好资料

    总的来说,掌握C语言指针不仅能够提高编程效率,还能深入理解内存管理和程序设计的底层原理。这份"C语言指针学习的好资料" PPT,无疑会通过丰富的例子和详细的解释,帮助学习者巩固和提升这方面的能力。通过系统学习...

    C语言指针教学重点和难点问题浅析.pdf

    【C语言指针教学重点和难点】 在C语言中,指针是编程中不可或缺的一部分,它扮演着连接程序逻辑和内存管理的关键角色。指针允许程序员直接操控内存,实现高效的数据处理和灵活的编程结构。然而,由于其复杂性和抽象...

    彻底搞定c指针

    《彻底搞定C指针》是一本专注于深入探讨C语言指针原理和应用的书籍,其目的在于帮助读者克服在C语言学习过程中对指针理解的困难,并解决长期困扰程序员的指针问题。作者作为资深C专家,通过生动且易于理解的例子,向...

    嵌入式c经典指针资料

    在IT领域,尤其是在嵌入式系统开发中,C语言是一种非常重要...掌握指针不仅有助于提高编程效率,还能为理解和调试底层代码提供坚实的基础。因此,无论你是初学者还是经验丰富的开发者,这个教程都将是一份宝贵的资源。

    C指针 C指针 C指针 C指针 C指针 C指针 C指针

    总的来说,C指针是理解C语言底层工作原理的关键,它允许直接操作内存,实现动态内存分配,数组和结构体的高效操作,以及函数间的复杂数据传递。熟练掌握指针能让你编写出更高效、更灵活的C程序。在后续学习中,我们...

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

    本文将深入探讨C语言指针的教学方法,旨在帮助学习者更好地理解和掌握这一概念。 首先,理解指针的本质至关重要。指针是一个变量,它存储的是另一个变量的内存地址。在内存模型中,每个变量都有一个唯一的地址,这...

    c指针软件基础课件pdf

    通过“C指针软件基础课件”的学习,开发者不仅能掌握指针的基本操作,还能深入理解C语言底层的工作机制,为进阶学习C++或其他系统级编程语言打下坚实基础。在实际编程中,熟练运用指针技巧可以大大提高代码的效率和...

    C语言指针精髓

    《C语言指针精髓》是一本深入探讨C语言指针的专著,对于任何想要精通C语言的人来说,理解和掌握指针都是至关重要的。C语言以其高效、灵活性和底层控制能力而受到广泛赞誉,其中指针是其核心特性之一,它使得程序能够...

    彻底搞定C指针彻底搞定C指针彻底搞定C指针

    在编程世界中,C语言是一种基础且至关重要的语言,尤其...同时,阅读优秀的C语言指针教程和参考书籍,如《C Programming Language》(K&R)或《Expert C Programming - Deep C Secrets》等,也将极大地助益于你的学习。

    C语言之指针数组函数

    《C语言之指针、数组和函数》 在C语言中,指针、数组和函数是三个核心概念,它们在程序设计中起着至关重要的作用。指针是C语言的精髓之一,它允许我们直接访问内存地址,进行高效的数据操作。而数组则是一种存储...

    指针是c语言的重点指针是c语言的重点.doc

    指针是C语言的核心特性,它是C语言编程中不可或缺的一部分,因为指针的理解与使用直接影响到程序的效率和复杂数据结构的设计。C语言通过指针提供了对内存的直接操作,使得程序员可以高效地管理和操控内存资源。 在...

Global site tag (gtag.js) - Google Analytics