学习指针不可少的好文章

合集下载

C语言指针学习总结

C语言指针学习总结

C语⾔指针学习总结上学的时候学习C语⾔,最烦的就是⾥⾯指针,可是指针也恰恰是C语⾔的灵魂。

最近在重温数据结构的内容,因为⼤多数据结构的教材都是⽤C语⾔描述的,⽽数据结构中也⼤量的⽤到了指针的内容,所以我就在这篇笔记中记录⼀下我这周复习C语⾔的⼼得。

先看看百科上对指针的描述。

在计算机科学中,指针(Pointer)是编程语⾔中的⼀个对象,利⽤地址,它的值直接指向(points to)存在计算机存储器中另⼀个地⽅的值。

由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。

因此,将地址形象化的称为“指针”。

意思是通过它能找到以它为地址的内存单元。

作个⽐喻,假设将计算机存储器当成⼀本书,⼀张内容记录了某个页码加上⾏号的便利贴,可以被当成是⼀个指向特定页⾯的指针;根据便利粘贴⾯的页码与⾏号,翻到那个页⾯,把那个页⾯的那⼀⾏⽂字读出来,这就是指针的作⽤。

下⾯将通过⼀些代码说明指针在C语⾔中的表现形式。

int main(){int a ;a = 10;int *p;p = &a;}如果⽤图⽚描述这段代码,就是下⾯这个样⼦。

怎么来理解呢?⾸先这段代码⾥通过int a和int *p定义了两个变量:分别是p和a,p变量与a变量的定义⽅式有⼀些不同,a变量就是C语⾔中⼀个很普通的int型变量,通过a=10将10这个整型赋值给了a。

⽽p变量的定义前⾯有⼀个 * ,这个 * 表明了p变量是⼀个指针变量,指针变量⾥⾯只能存放地址,这个地址是内存中的某个位置,在上⾯的代码中我们在p变量⾥⾯存放的是0x2C406B24这个地址,这个地址⾥⾯存放的值必须是int值,在我们这⾥,p变量⾥⾯存放的地址是a变量的地址,a变量在定义时就是⼀个int,所以是符合要求的。

这样⼀来,我们就说p变量指向了a变量,p = &a这句代码完成了p指向a的这个操作。

这⾥没有写p = a,那是因为p变量需要的是⼀个地址,⽽不是a变量⾥⾯存放的值,所以&这个操作符就是取地址的意思,通过&a取到a变量在内存中的地址,将地址赋值给p指针变量,就使p指向了a。

第8章 指针

第8章  指针

上面提到了不能通过指针修改指针所指向的值,那如果可以 通过指针修改指针所指向的值,但却不能使指针指向别的 值,怎么实现呢?这时就要使用const指针。 int a=5; int *const pa=&pa;
8.6 小结
本章学习了指针,指针是一个非常灵活的东西,在使用的过 程中一定要注意。首先对指针中可能涉及到的知识内存以 及内存变量作了讲解。然后再对指针进行定义与初始化, 知道如何定义一个指针,以及初始化过程中要注意的问题 。接着是怎样操作指针,还可以定义指针的指针,其实就 是一个指针中存放另一个指针的地址。然后利用指针来操 作数组,以及怎样利用指针来输出数组的值。最后学习了 指向const变量的指针与const指针。
8.5.1 指向 指向const变量的指针 变量的指针
如果一个指针指向const变量,那么不能通过指针来改修指 针把指向的值。为了达到不通过指针修改指针所指向的值 ,那么这个指针也必须声明为const。 const int a=5; const int *pa; pa=&a;
8.5.2 const指针 指针
8.1.3 指针的定义与初始化
上面讲了获取变量的内存地址,那什么是指针呢?指针的定 义为:指针用于指向对象。仍然以上面的储物箱为例子, 当张三来到银行时,为了拿出自己的物品,这时就要找到 银行的储物员,告知储物员来取他的物品,这时储物员就 会根据张三的信息,找到张三在银行储物箱中的物品,并 交给张三,这里的银行储物员就相当于指针,它通过张三 的信息,然后找到张三的储物箱,也就是说储物员那里有 张三储物箱的号码,他就是根据这个号码找到张三的箱子 的。
8.1.1 内存简介
学习指针之前,先对数据在内存之中如何存储与读取做简单 介绍。 程序在运行时,将把其中的数据存放在内存中,如果要存储 某个变量,系统便会存储这个变量到相应的内存区域。如 要读取某个变量,系统便会在这个变量相应的内存区域进 行读取。

c语言指针知识点实验总结

c语言指针知识点实验总结

c语言指针知识点实验总结C语言指针是一种重要的编程概念,而掌握指针的知识对于提高代码的效率和灵活性至关重要。

本文将对C语言指针的知识点进行实验总结,帮助读者更好地理解和应用指针。

1. 指针的定义和基本概念指针是一种变量,它存储着一个内存地址,这个地址对应着存储的数据。

通过指针,我们可以直接访问和操作内存中的数据,提高程序的效率和灵活性。

在C语言中,我们使用"*"来声明指针变量。

2. 指针的使用方法使用指针的第一步是声明指针变量,并且将它指向一个合法的内存地址。

为了确保指针的有效性,我们可以使用取地址符"&"获取变量的地址。

通过指针,我们可以访问存储在该地址上的数据,可以使用"*"来解引用指针,获取或修改指针指向的数据。

3. 指针和数组的关系数组名在C语言中可以被视为指向数组首元素的指针。

通过指针算术运算,我们可以便捷地访问数组中的不同元素,实现数组的遍历和操作。

4. 指针和函数的关系通过指针,我们可以将函数的地址作为参数进行传递。

这样的参数被称为函数指针,通过函数指针,我们可以灵活地在程序中调用不同的函数,实现更加通用和可复用的代码。

5. 指针的动态内存分配C语言提供了动态内存分配的机制,即通过指针在运行时申请内存空间。

使用动态内存分配可以避免静态内存不足的问题,同时也提高了内存的利用效率。

需要注意的是,在使用完毕后,我们必须手动释放被分配的内存。

6. 指针的常见问题和注意事项在使用指针的过程中,我们需要注意指针的有效性、指针的赋值和修改、指针的比较以及指针的空指针问题等。

对于指针操作的不当,可能导致程序的崩溃或者产生错误的结果。

通过实验总结,我们深入探讨了C语言指针的相关知识点。

掌握了指针的定义和基本概念,了解了指针的使用方法,学习了指针和数组、函数的关系,熟悉了指针的动态内存分配,同时也了解了指针的常见问题和注意事项。

通过对C语言指针的综合学习,读者将能够更加灵活地运用指针,提高程序的效率和可维护性。

C语言程序设计论文 (指针)

C语言程序设计论文 (指针)

C语言程序设计论文摘要:指针是C语言的精髓部分,也是C语言的重要特色。

本文从指针的基本概念出发,结合具体实例对指针的类型进行了分析,并对指针在实际应用中常出现的问题进行了归类总结,希望对初学者理解“指针”这一重要概念有所帮助。

摘要:指针是C语言的精髓部分,也是C语言的重要特色。

本文从指针的基本概念出发,结合具体实例对指针的类型进行了分析,并对指针在实际应用中常出现的问题进行了归类总结,希望对初学者理解“指针”这一重要概念有所帮助。

关键词:C语言指针数组函数指针是C语言中的精髓,它在C语言中被广泛的使用。

理解和运用好指针可以灵活方便地处理程序中各种复杂问题,可以轻松完成其他高级程序设计语言不便完成的任务。

一、指针的概念一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

指针的引入为系统存取数据提供了一种“间接访问”方式。

所谓间接访问,是先访问存放变量地址的存储单元,得到该变量的地址,再对变量内容进行访问。

指针变量是一种特殊变量。

系统为指针变量分配一块连续存储单元不是供其存储数据,而是存储内存地址。

因此,指针变量是存储内存地址的变量。

二、指针的类型1、指向简单变量的指针。

指针所指的数据类可以是简单的数据类型。

例:(1)int*p,i;p=&i;意思是指针变量指向整型变量i(2)char*p,a;p=&a;意思是指针变量指向字符型变量a(3)int*p,a[10];p=a;意思是指针变量指向数组a2、指向数组的指针。

指针所指的数组既可以是一维数组,也可以是多维数组。

例:main(){inta[4]={2,4,6,8};int*p;for(p=a;p<a+4;p++)printf(“%2d”,*p);}分析:指针p指向了a数组的首地址,通过p++来访问a数组的每一元素。

3、指针数组。

数组元素是由指针变量组成的一种指针。

定义如:int*p[2];指针数组p包含两个元素,每个元素指向一个整型数据。

关于时钟和指南针的作文材料作文好

关于时钟和指南针的作文材料作文好

关于时钟和指南针的作文材料作文好示例文章篇一:《时钟与指南针》嘿,大家好呀!今天我想跟你们聊聊时钟和指南针这两个神奇的东西。

你们看,时钟那滴答滴答的声音,就像一个不知疲倦的小鼓手,一直在有节奏地敲打着。

它的指针不停地转呀转,一刻也不停歇。

时针走得慢悠悠的,像个稳重的老爷爷;分针呢,稍微快一些,像个忙碌的中年人;秒针跑得最快啦,简直就是个调皮的小孩子,一刻也闲不住。

每次我看着时钟,心里都会想:“时间怎么过得这么快呀?” 比如说,我玩游戏的时候,感觉才玩了一小会儿,可时钟的指针已经走了一大圈,妈妈就会在旁边喊:“哎呀,别玩啦,时间都跑掉好多啦!” 这时候我就会想,时钟是不是在故意跟我作对呀?再来说说指南针吧。

它可不像时钟那样会滴答滴答地响,它总是静静地待在那里,默默地给我们指明方向。

不管我们走到哪里,它好像都在说:“别怕,我知道路,跟着我走就对啦!” 有一次,我们一家人出去爬山,走着走着就迷路了,大家都急得像热锅上的蚂蚁。

这时候,爸爸拿出了指南针,它就像一个超级英雄,一下子就把我们带出了困境。

我当时就在想,要是没有指南针,我们可怎么办呀?你们说,时钟和指南针,哪个更重要呢?是一直告诉我们时间流逝的时钟,还是在迷茫时为我们指引方向的指南针呢?我觉得呀,它们两个都很重要!就好像我们在学校里,老师教给我们知识,就像时钟提醒我们要珍惜时间,好好学习;而好朋友在我们遇到困难,不知道该怎么办的时候,给我们出主意,就像指南针为我们指明方向。

时钟让我们懂得珍惜每一分每一秒,不虚度光阴;指南针让我们在迷茫的时候不迷路,坚定地朝着目标前进。

它们就像是我们生活中的两个好伙伴,一个提醒我们要努力向前跑,一个告诉我们别跑错了方向。

所以呀,我们要好好利用时钟和指南针,让它们帮助我们过上精彩的生活!你们觉得我说得对不对呢?示例文章篇二:《时钟和指南针,谁更重要?》嘿,朋友们!你们有没有想过,时钟和指南针,到底谁更重要呢?就先来说说时钟吧!每天早上,当我还在睡梦中的时候,“滴答滴答”,时钟就开始工作啦!它那有规律的声音,好像在对我说:“小懒虫,快起床,上学要迟到啦!”有了时钟,我能清楚地知道几点该起床,几点该吃饭,几点该睡觉。

真正掌握C语言的指针和内存管理技巧

真正掌握C语言的指针和内存管理技巧

真正掌握C语言的指针和内存管理技巧指针和内存管理技巧是学习C语言中至关重要的一部分,同时也是提高程序效率和准确性的关键。

本文将从以下几个方面介绍真正掌握C语言的指针和内存管理技巧。

第一章:指针的基本概念和使用方法指针是C语言中的一种数据类型,它用于存储和操作内存中的地址。

在C语言中,我们可以通过声明指针变量来存储一个地址,并且可以使用"*"操作符来访问该地址中存储的数据。

本章将详细介绍指针的声明、赋值和使用方法,并通过一些示例代码来加深理解。

第二章:指针与数组的关系与应用指针和数组在C语言中密切相关,理解它们之间的关系对于掌握C语言的指针和内存管理技巧非常重要。

本章将介绍如何使用指针来访问和操作数组中的元素,以及如何通过指针传递数组给函数,并对数组进行排序和搜索等操作。

第三章:指针与字符串的处理在C语言中,字符串实际上是以字符数组的形式存在的,因此使用指针来处理字符串会更加高效和便捷。

本章将介绍如何使用指针来处理字符串,包括字符串的赋值、拼接、比较和查找等操作,并给出一些常见的字符串处理技巧和注意事项。

第四章:指针与动态内存分配在C语言中,动态内存分配是一种重要的内存管理技巧,它可以根据程序运行时的需要来动态地分配和释放内存。

本章将介绍如何使用指针来进行动态内存分配,包括使用malloc、calloc和realloc等函数来分配内存,以及使用free函数来释放内存,并给出一些常见的动态内存分配技巧。

第五章:指针与结构体的关联结构体是C语言中一种自定义的数据类型,它可以将多个不同类型的数据组合在一起形成一个整体。

在使用结构体时,指针的应用可以更加灵活和高效。

本章将介绍如何使用指针来操作结构体,包括结构体指针的声明、赋值和解引用等操作,并给出一些常见的结构体指针的应用场景。

第六章:指针与函数的关系与应用函数是C语言中组织和结构化程序的重要手段,而指针在函数中的应用可以带来更高的灵活性和可扩展性。

C语言中指针的研究与学习

C语言中指针的研究与学习[摘要]指针是C语言中广泛使用的一种数据类型。

运用指针编程是C语言最主要的风格之一,它是c中的难点和重点。

文中在介绍指针的概念的基础上把指针不同的形式分成两大类讲述,让学习指针的人更好的理解与记忆。

[关键词]指针数组地址变量凡是学习过c语言的都知道指针是c的灵魂,它极大的丰富了c语言的功能。

我不想重复很多数书上以及别人说得很清楚的东西,我只是把我这几年来对c语言指针的学习心得在这里总结一下。

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

在学习指针时,很多人都会被它的灵活形式给弄混淆,比如:(1)int p, (2)int *p[3], (3)int (*p)[3],(4)int(*p)(),(5)int *p()等等。

要理解不同的形式,我觉得可以从两个方面来学习,这些形式可分为,指向某一对象的指针以及值为指针类型两大类。

在介绍这两种形式之前我们先来搞清楚指针的概念。

可以用一个通俗的例子来说明指针的概念。

我们到图书馆找书时,首先根据图书馆的目录找到对应的书架号,找到书架后再找到我们要找的书。

在这里,书架号就是一种地址,我们也把它叫做指针,要找的书就是内容。

在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。

因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。

指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。

指针变量的赋值只能赋予地址,决不能赋予任何其它数据,否则会引起错误。

C语言中提供了地址运算符&来表示变量的地址。

其一般形式为:&-变量名;如&a-变示变量a的地址。

变量本身必须预先说明。

设有指向整型变量的指针变量p,如要把整型变量a的地址赋予p可以用下面的方法:int *p,a; p=&a;接下来我们来理解前面我们所说的指针的两大类:一、指向某一对象的指针通过多次学习指针我得出:要使指针变量指向某一对象即将该对象的地址赋值给该指针变量,例如:(1)int *p ,i; p=&i;意思是指针变量指向整型变量i(2)char *p ,a ; p=&a; 意思是指针变量指向字符型变量a(3)int *p,a[10]; p=a; 意思是指针变量指向数组a以上几种便说明了刚刚说的结论。

我眼中的指针 1 —学习指针不可少的好文章

我眼中的指针 1 —学习指针不可少的好文章第一章指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

要搞清一个指针,需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

让我们分别说明:先声明几个指针放着做例子:例一:(1)int *ptr;(2)char *ptr;(3)int **ptr;(4)int (*ptr)[3];(5)int *(*ptr)[4];1、指针的类型。

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。

这是指针本身所具有的类型。

让我们看看例一中各个指针的类型:(1)int *ptr; //指针的类型是int *(2)char *ptr; //指针的类型是char *(3)int **ptr; //指针的类型是int **(4)int (*ptr)[3]; //指针的类型是int(*)[3](5)int *(*ptr)[4]; //指针的类型是int *(*)[4]怎么样?找出指针的类型的方法是不是很简单?2、指针所指向的类型。

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。

从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

例如:(1)int *ptr; //指针所指向的类型是int(2)char *ptr; //指针所指向的的类型是char(3)int **ptr; //指针所指向的的类型是int *(4)int (*ptr)[3]; //指针所指向的的类型是int()[3](5)int *(*ptr)[4]; //指针所指向的的类型是int *()[4]在指针的算术运算中,指针所指向的类型有很大的作用。

指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。

C语言指针经验总结

C语言指针经验总结C语言是一门计算机编程语言,其具有高效性、灵活性和可移植性等特点,被广泛应用于系统程序、嵌入式系统和网络编程等领域。

而指针作为C语言的重要特性之一,具有重要的作用。

在使用指针的过程中,我积累了一些经验,现总结如下。

首先,指针作为C语言的特性,应当充分理解其基本概念和运用方法。

指针是一个用来存储内存地址的变量,通过它可以直接访问内存中的数据。

在使用指针的过程中,我们需要注意指针的声明和初始化。

指针的声明方式为类型 *变量名,比如int *p;指针的初始化可以是指向一些变量的地址,也可以是NULL,表示指针不指向任何有效的地址。

其次,指针的应用范围非常广泛,特别是在数组、字符串和函数等方面。

在数组中,可以通过指针来遍历数组元素,或者通过指针作为函数参数来传递数组。

在字符串中,可以使用指针来访问字符串中的字符,或者通过指针来实现字符串之间的复制和比较等操作。

在函数中,指针可以作为参数传递给函数,用来在函数内部修改函数外部的变量值。

其三,指针的运算与使用是需要谨慎的。

在指针运算中,要注意指针的加法和减法操作。

指针的加法是根据指针所指向的对象的大小来进行的,比如int类型的指针加1,实际上增加的是4个字节;指针的减法则是求出两个指针之间的距离,也就是数组中的元素个数。

在使用指针的过程中,要注意指针的合法性和有效性,避免出现野指针和空指针的情况。

然后,指针的动态内存分配是C语言中常用的技术。

在C语言中,可以使用malloc函数来动态地分配内存空间,并返回一个指向该内存空间的指针。

在使用完动态分配的内存后,需要及时使用free函数来释放该内存空间,以避免内存泄漏的问题。

同时,还需要注意动态内存分配时的错误处理和异常情况的处理,以保证程序的稳定性和安全性。

最后,指针的概念和使用需要通过实践不断加深理解和熟悉。

在编写C程序时,我们应该注重指针的运用,尽可能地将其应用到实际的编程中。

可以通过编写一些指针相关的程序来加强对指针的理解和运用。

c语言指针程序心得

c语言指针程序心得C语言是一门重要的计算机基础课程,而指针是C语言的精华,指针在C语言中具有十分高的地位,它应用范围广,使用灵活等特点时常让我们感到困惑。

掌握指针的使用方法是一个C语言程序员应该具有的基础技能。

在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。

由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。

因此,将地址形象化的称为“指针”。

意思是通过它能找到以它为地址的内存单元。

指针学习首先应掌握其基本概念。

指针即地址,地址即指针。

程序运行工程中,变量、数组、函数等都存放在内存的存储单元中,每个存储单元都有地址。

举一个贴近生活的例子,把一个地区比作内存,房子比作指针,居民比作变量。

我们要在内存找一个变量,可以根据指针。

就如在一个地区要找一个人,我们可以通过寻找这个人的住址把这个人造出来。

使用变量、数组、函数既可以直接访问,又可以利用其存储单元地址进行间接访问,这种间接访问便是借助指针来完成的。

利用指针可以访问各种类型的数据,能够实现动态存储分配,提高编程效率,加深对数据存储方式的理解等等优点。

不仅如此,指针还可以提高效率。

C语言是一种偏底层的语言,为了更直接对内存进行操作,必须使用指针。

因为指针是根据内存的地址来操作变量。

如果需要传输大量的数据,可以通过传输起始地址和结束地址来代替(即传递指针),前提是储存的数据地址必须是连续指针还可以提高灵活度。

尽管数据的储存单位不是连续的,但并不影响这些数据的逻辑关系。

指针就是实现链式储存结构的桥梁,通过指针把这些分散在内存不同地方的数据联系起来。

当然,指针也是一把双刃剑,如果对指针不能正确理解和灵活有效的应用,利用指针编写的程序也更容易隐含各式各样的错误,同时程序的可读性也会大打折扣。

因此,正确的使用指针会给编程带来很多的便利,我们也应当好好学会去应用好它,争取在今后的学习中不断取得进步。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习指针不可少的好文章!为初学者服务。

这是我的帖子的宗旨。

我也是个初学者(强调了无数遍了),我以我的理解把初学者觉得难懂的东西用浅显的语言写出来。

由于小学时语文没学好,所以竭尽全力也未必能达到这个目的。

尽力而为吧。

指针是c和c++中的难点和重点。

我只精通dos下的basic。

c语言的其它各种特性,在basic 中都有类似的东西。

只有指针,是baisc所不具备的。

指针是c的灵魂。

我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清楚或没有说,而我又觉得我理解得有点道理的东西写出来。

我的目的是:1。

通过写这些东西,把我脑袋中关于c的模糊的知识清晰化。

2。

给初学者们一点提示。

3。

赚几个经验值。

(因为贴这些东西没有灌水之嫌啊)第一章。

指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。

要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。

让我们分别说明。

先声明几个指针放着做例子:例一:(1)int *ptr;(2)char *ptr;(3)int **ptr;(4)int (*ptr)[3];(5)int *(*ptr)[4];如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;<如何理解c和c++的复杂类型声明>>。

1。

指针的类型。

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。

这是指针本身所具有的类型。

让我们看看例一中各个指针的类型:(1)int *ptr; //指针的类型是int *(2)char *ptr; //指针的类型是char *(3)int **ptr; //指针的类型是int **(4)int (*ptr)[3]; //指针的类型是int(*)[3](5)int *(*ptr)[4]; //指针的类型是int *(*)[4]怎么样?找出指针的类型的方法是不是很简单?2。

指针所指向的类型。

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。

从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

例如:(1)int *ptr; //指针所指向的类型是int(2)char *ptr; //指针所指向的的类型是char(3)int **ptr; //指针所指向的的类型是int *(4)int (*ptr)[3]; //指针所指向的的类型是int()[3](5)int *(*ptr)[4]; //指针所指向的的类型是int *()[4]在指针的算术运算中,指针所指向的类型有很大的作用。

指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。

当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。

我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。

3。

指针的值,或者叫指针所指向的内存区或地址。

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。

在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。

指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。

以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

指针所指向的内存区和指针所指向的类型是两个完全不同的概念。

在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。

以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的类型是什么?该指针指向了哪里?4。

指针本身所占据的内存区。

指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。

在32位平台里,指针本身占据了4个字节的长度。

指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。

第二章。

指针的算术运算指针可以加上或减去一个整数。

指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。

例如:例二:1。

char a[20];2。

int *ptr=a;......3。

ptr++;在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。

接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。

由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。

由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。

我们可以用一个指针和一个循环来遍历一个数组,看例子:例三:int array[20];int *ptr=array;...//此处略去为整型数组赋值的代码。

...for(i=0;i<20;i++){(*ptr)++;ptr++;}这个例子将整型数组中各个单元的值加1。

由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。

再看例子:例四:1。

char a[20];2。

int *ptr=a;......3。

ptr+=5;在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5 乘sizeof(int),在32位程序中就是加上了5乘4=20。

由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。

在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。

虽然这种情况在应用上会出问题,但在语法上却是可以的。

这也体现出了指针的灵活性。

如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。

总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。

ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。

就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold 的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。

ptrnew的值将比ptrold 的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。

第三章。

运算?amp;和*这里&是取地址运算符,*是...书上叫做"间接运算符"。

&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。

*p的运算结果就五花八门了。

总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

例五:int a=12;int b;int *p;int **ptr;p=&a;//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。

*p=24;//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p 就是变量a。

ptr=&p;//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int**。

该指针所指向的类型是p的类型,这里是int*。

该指针所指向的地址就是指针p自己的地址。

*ptr=&b;//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。

**ptr=34;//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。

第四章。

指针表达式。

一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表达式。

下面是一些指针表达式的例子:例六:int a,b;int array[10];int *pa;pa=&a;//&a是一个指针表达式。

int **ptr=&pa;//&pa也是一个指针表达式。

*ptr=&b;//*ptr和&b都是指针表达式。

pa=array;pa++;//这也是指针表达式。

例七:char *arr[20];char **parr=arr;//如果把arr看作指针的话,arr也是指针表达式char *str;str=*parr;//*parr是指针表达式str=*(parr+1);//*(parr+1)是指针表达式str=*(parr+2);//*(parr+2)是指针表达式由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。

在例七中,&a不是一个左值,因为它还没有占据明确的内存。

*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。

第五章。

数组和指针的关系如果对声明数组的语句不太明白的话,请参阅我前段时间贴出的文?lt;<如何理解c和c++的复杂类型声明>>。

数组的数组名其实可以看作一个指针。

看下例:例八:int array[10]={0,1,2,3,4,5,6,7,8,9},value;......value=array[0];//也可写成:value=*array;value=array[3];//也可写成:value=*(array+3);value=array[4];//也可写成:value=*(array+4);上例中,一般而言数组名array代表数组本身,类型是int [10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int *,所指向的类型是数组单元的类型即int。

相关文档
最新文档