- 浏览: 149711 次
- 性别:
- 来自: 北京
文章分类
最新评论
最近对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为字符串常量,是不允许修改的。
发表评论
-
Linux date 命令使用技巧
2011-08-04 17:10 986date命令 date命令的功能是显示和设置系统日期和时间 ... -
LDAP over SSL - Modifying Active Directory with PHP
2011-04-29 14:30 2319Some AD objects can be modifi ... -
linux shell 自定义函数(定义、返回值、变量作用域)介绍
2011-03-31 15:50 3157linux shell 可以用户定义函数,然后在sh ... -
shell中的加法
2011-03-31 13:43 1457今天搞了半天i=$i+1;因为这句包含在一个较长的shell脚 ... -
Shell #的用法, ${#arrayname[@]}获取数组元素的个数, $arrayname[index]获取属于一个元素 获取数组中的所有元素${arr
2011-03-31 10:35 3967在shell中$#表示输入参数的个数; ... -
设置linux环境变量
2011-03-04 11:29 9831.Linux的变量种类 按变量的生存周期来划分,Lin ... -
Xlib: connection to ":0.0" refused by server的解决方法
2011-03-03 17:00 1058Xlib: connection to ":0.0& ... -
linux的root密码更改
2011-02-24 20:17 853不知道是很久没用的原因还是什么,我的linux的密码竟然 ... -
su与su-的区别(Linux Shell中切换用户)
2011-02-18 12:54 2647前者只是切换了身份,但SHELL环境仍然是原用户的SHEL ... -
在VI编辑器中让所有的字母都变成大写
2011-01-13 10:31 1473在vi中切换到命令行模式(按下ESC),输入以下正则表达 ... -
Linux常用的20个工具
2011-01-06 10:30 1264要监控服务器的运行状况? 尝试一些内建的命令行与少量的外围工具 ... -
tar命令详解
2011-01-05 16:35 820格式: tar 选项 文件目录列表功能: 对文件目录进 ... -
网络配置===route命令和netstat命令
2010-12-15 17:03 1244route命令和netstat命令 (netstat - ... -
Linux 网卡配置文件设置
2010-12-15 13:57 12251.配置文件/etc/hosts(本地主机ip地址映射,可以有 ... -
linux设置目录共享
2010-12-10 11:15 9501 vi etc/samba/smb.conf 打开配置文档 ... -
Linux 双击文件夹 不要每次都打开一个新窗口显示
2010-11-25 16:35 1424在打开最顶层文件夹的时候用右键 里面有个浏览文件夹 就可以了 ... -
Linux文件权限详解
2010-11-24 16:24 817一、文件和目录权限概 ...
相关推荐
C语言指针理解C语言指针理解C语言指针理解
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
深入理解C语言指针的奥秘深入理解C语言指针的奥秘深入理解C语言指针的奥秘深入理解C语言指针的奥秘
二、变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 三、指针的几个相关概念 1. const属性 2. void型指针 3. 空指针和野指针 四、指向不同数据类型的指针 1. 数值...
深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入理解C语言指针的奥秘.doc 深入...
深入理解C语言指针.pdf
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语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言指针教程C语言...
对C语言指针不太理解的 看看 这篇文章非常好 看后肯定能完全理解指针
在C语言中,指针恐怕是令每个人都头疼的问题。这个资料对C语言中的指针作了比较详细的解答,也许会对你们有一定的帮助
C语言指针函数和函数指针详细介绍.
本文主要讲了一下关于C语言指针的相关概念,希望对你的学习有所帮助。
指针深入理解 指针深入理解 指针深入理解