浅析c语言指针.doc

浅析c语言指针.doc

ID:51742196

大小:71.00 KB

页数:9页

时间:2020-03-15

浅析c语言指针.doc_第1页
浅析c语言指针.doc_第2页
浅析c语言指针.doc_第3页
浅析c语言指针.doc_第4页
浅析c语言指针.doc_第5页
资源描述:

《浅析c语言指针.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、浅析C语言指针指针简介指针是c语言的一个最重要的特征,它提供了一种统一的方法,使其能访问远程的数据结构。但对c语言初学者而言,在编程过程中熟练的使用指针并不能像使用int型变量一样地轻松愉快,容易上手,往往是不得其精髓。我们知道,不论什么时候,运行一个程序A,首先都是操作系统自身的加载器把A装入内存,然后CPU才能执行。所以A程序的所有要素都会驻留在内存的某个位置。下面我们看一段示例程序。#includeintemp(intfirst,intsecond){return(first>second?first.:second);}intmain(intargc,char**argv){inti=

2、5;intj二9;returnemp(i,j);首先,编译器会为变量i和j开辟内存空间,用來存储i和j的值。同时也会为函数cmp开辟空间来存放其代码。这样使得最终的可执行程序就变为了跟内存一一对应的序列。操作系统的加载器把这个可执行程序载入内存后,cpu就可以按一条条的语句顺序执行了。既然内存空间同程序的所有要素是一一对应的,那么怎么区分各要素的存放位置呢?内存使用不同的地址存放不同的要索,如下所示。由于变量都存放于内存地址空间,并且与地址之I'可是一一对应的,那么利用地址能做些什么呢?我们可以把地址存放到别的变量屮,以便我们可以在以后程序的某个地方使用它。C语言有一个专门用来存储内存地址的变

3、量,这就是指针变量,通常我们称之为指针(pointer)o它是一种变量类型,这种变量方便我们把需要操控的内存地址记忆起来。定义指针定义指针的运算符同乘法运算符是一样的,都用表示。定义一个指针变量在语法上是简单的,同我们定义其他变量的区别是:首先规定它指向的变量类型,然后并不是立即就给出其变量的标识符,而是在变量类型同变量标识符之间插入指针运算符(星号),这样就告诉编译器这是一个指针变量。C语言屮指针可以指向任何的数据类型,包括函数。函数指针的定义是:函数返回值+(*+函数指针变量标识符)+(函数的参数列表)。函数指针能构建出更加清晰的程序结构。编程中经常使用的指针定义就是这两种,当然有些定义可

4、能只是语法上面有意义,但是语义上面不一定有具体的意义。例如,int*(*(*(*f)())[])()声明f是一个函数指针,该函数返冋一个指针,该指针指向数组,该数组元素是指针,那些指针指向返回值类型为整型指针的函数。这样的声明可能永远也不能应用到实际的代码中。指针和数组数组是内存中一段连续相同类型的内存数据,这组数据的首地址以数组名字来标识。所有数组对其数据的操控都可以使用指针来实现,同理,指针指向一段内存数据时,也可以使用数组下标的方式来实现操作。数组与指针在使用上的某些地方是非常相似的,但是数组与指针又有一些细小的区别。数组名表现为一个静态指针,也可以直接把它赋值给指针变量,但它的大小与指

5、针通常是不同的。数组名的内涵在于其指代的实体是一种数据结构,这种数据结构就是数组。数组名可以作为参数传入一个接受参数为指针的函数内部,但是此时数组完全丢失了数组的本义,变成了完全的指针类型,其常量特性(可以作自增、自减等操作)可以被修改。并且,数组名不能再重新赋值为英他的数组名字,而指针变量是可以被重新赋值并指向一段新的内存地址的。指针的运算指针的运算指的是指针的一、++、-和+运算,一个指针可以加上或者减去一个整数。两个指针相减得到的是指针之间相隔的元素个数。不同的指针变量之间进行相加运算尽管在语法上是合理的,但是从语义上来讲是没有意义的。除了void型指针和函数指针以外,所有其他类型的指针

6、都可以进行指针运算。通过指针变量的增加或减少,指针变量会指向新的内存地址。一般来说,指针变量自身的大小在理论上是指机器的字长,但是指针变量的运算并不是按照指针变量口身的大小进行内存偏移的,而是按照指针变量指向的变量类型大小进行内存偏移的。比如,声明一个整形的指针P,假定p的地址是0x4323672,那么++p后p的值变为0x43236726。偏移的内存大小等于整形变量的内存大小4(sizeof(int))。同理,double型指针进行++运算后偏移值就是8(sizeof(double))o指针强转如同整形变量可以强转为浮点型变量一样,指针类型也可以通过强转变成新的指针类型,比如我们可以把整形指

7、针强转为字符型指针。指针强转最诱人的地方就在于对内存数据进行操控就够了。指针强转使得指针对数据的操控更具有针对性,而口通过指针的默认强转可以使得函数的参数更简单,且传递的信息量是不变的。比如,void*作为参数时可以把任意的指针变量传递到函数内部进行相关的操作。下面我们来看一个具体的例子。数据的内存布局如下图所示,首先是一个字符型数据,紧接着的是两个整形数据,最后面是二个结构体A型数据。我们需要做

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。