c指针的应用.doc_第1页
c指针的应用.doc_第2页
c指针的应用.doc_第3页
c指针的应用.doc_第4页
c指针的应用.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

指针就是地址。 按类型来分指针有 int、char 、float等基本类型。 对于扩充的数据类型则有struct 等。 指针的类型决定了指针操作时该指针指向地址变化的规律。 例: int a, *p; /定义了一个整型指针以后就可以写为 p=&a; 这个好理解。 麻烦的是指针与数组结构等结合起来了之后情况就变得复杂起来,如下例: int arr10, *p; p=arr; 此时把数组的地址赋给了指针p,指针p就指向了数组的首地址。现在假设数组的首地址值是3452,则指针p的值必然是3452。那么 p+1 表示指针移动指向了数组的下一个元素,那么p+1的值是什么?初学指针时对这一点很容易搞错不加思索的回答既然p=3452,那么p+1就等于3452+1=3453, 如果这样去认识指针就大错特错了。这里的p+1不是简单的算术运算,它表示这样一个意思指针移动了一个元素准确地说是指针移动了一个整型元素。一个整型变量占多少字节内存:2 个字节,所以在这里指针的地址变化为一个整型变量那么它的地址自然要在原来的地址值上加 2 ,所以指针移动一个整型元素后地址值应为3452+2,即指针p的值为3454。 上面讲的是整型指针的情形,对于字符型指针呢?其实只要对上面所讲的道理真正理解了,字符型指针也就好理解了。例子如下: char aa10, *p; p=aa; 同样假设数组的首地址为3452,那么p+1 的值可以这样考虑,指针移动一个字符的地址,而一个字符占一个字节的内存,所以p+1的值就为3452+1=3453。 可以说上面的二种情形还好理解,对于指向二维数组的指针以及指向结构的指针又如何去正确理解呢? 当指针与二维数组连在一起的时候情形就变得复杂了许多。因为数组名代表了数组的起始地址,如 char arr56; 那么数组名 arr就是这个二维数组的首地址。初学指针的朋友对这个问题总是弄不明白,既然二维数组名arr是一个地址,而指针变量就是存放地址的,把二维数组的地址赋给同样数据类型的指针不就可以了吗,于是就有这样的写法:char arr56, *p; p=arr; 这样写肯定是错误的,有的朋友可能对这样写是错误的也明白,他们基于这样的理解:一个二维数组里的数组元素也是表示一个地址,于是得出结论,二维数组名是一个二级指针,是地址的地址,进而引申出如下写法: char arr56; char *p; p=arr; 然而很对不起,这样写同样是错误的,如果你不相信,你可以把你认为正确的代码输入到里面,编译一下,肯定是通不过的。 那么为什么上面的这些理解是错误的呢?错在对指针基本概念理解停留在表面。下面为了把这个问题说清楚一点,我们可以把指针的类型归纳为二个特征: 1、基本数据类型如(char、int、 float等); 2、扩充数据类型(如一维数组、二维数组、结构等) 例1: int arr45; /定义了一个二维数组 int *p; /定义了一个整型指针 / 下面该怎样把数组的地址赋给指针?因为定义的是一个int 指针,所以只能写为p=arr0; /想一想为什么? 这里要讲的就是把地址赋给指针时要注意的问题,p是 int 类型的指针,它只能指向 int 这个基本数据类型。有的朋友或许要问,这个二维数组不也是 int 类型吗?是的但是这个二维数组除了是 int 之外,它的类型全称应该是 int 二维数组,arr0是int 一维数组,arr0这个一维数组的各元素才是基本的 int 数据类型, p=arr0就是把这个一维数组第一个元素的地址赋给了int 类型的指针 p,. 数据类型完全一样才能赋值。那么显而易见可以有下面的写法,注意指针是怎样指向各数组元素的: char arr45=abc,def,ghi,jkl,mno; char *p=arr0; for(i=0;i20;i+) printf(%c, *(p+i) ); /仔细观察输出的值是怎样变化的 /因为定义的是一个字符型指针,那么1、必须使这个指针指向与其对应的字符型数据类型; 2、指针每增加一个单位的地址值 ,如p+1表示指向下一个字符的地址。所以printf()语句输出的结果为 abcdefghijklmno ,是一个字符一个字符输出的。 。 下面举一个整型指针的例子: int arr33= 1,2,3,4,5,6,7,8,9; int *p=arr0; /数据类型相同,可以赋地址值 for(i=0;i9;i+) printf(%d, *(p+i); / 逐个的输出数组元素 下面将要讲的是直接指向一个二维数组的指针它有哪些特点: 一个二维数组,它的每一个数组元素都是一个一维数组,一个整型二维数组可以写为: int arr33; 即 arr0, arr1, arr2 我们现在想定义一个指针,使得这个指针有这样的特性 指针 p指向arr0, 指针 p+1 指向arr1 ,指针 p+2指向arr2, 也就是指针每移动一个单位的地址就指向下一个一维数组,那么这个指针必须满足下面二个条件:1、必须是整型 2、必须每移动一个单位的地址时实际上移动一个一维数组的长度即3个整型量。那么这个指针可定义为如下形式: int (* p) 3 ; / 定义了一个指向二维数组的指针,这个二维数组中的一维数组有3个元素。 p=arr; / 把二维数组的地址赋给指针 p 如果二维字符数组初始化是 char arr34=abc,def,ghi; 所以可以如下写: *(p+0) /是数驵 a0 的首地址 printf(%s, *p); 输出字符串 “abc *(p+1) /数组a1的首地址 printf(%s, *(p+1); 输出字符串 def *(p+2) /数组 a2的首地址 printf(%s,*(p+2); 输出字符串 ghi 如果要用这个二维数组的指针逐个的输出字符可以写为: *(*(p+0)+0) /第一个字符 a *(*(p+0)+1) /第二个字符 b *(*(p+0)+2) /第三个字符 c *(*(p+0)+3) /第四个字符 d *(*(p+0)+4) /第五个字符 e . 依此类推 当指针指向结构时的情形。 如果对指向数组的指针完全理解了,那么对指向结构的指针也就很好理解了。实际上一个指向结构的指针更容易理解。 设定义了一个结构如下,有一个结构数组,三个结构。 struct student int a;char *b;stru3=1,abc,2,def,3,ghi; struct student *p=stru; p+0 /第一个结构的地址 p+1 /第二个结构的地址 p+2 /第三个结构的地址本文章来自 21视频教程网 C语言中指针的使用_C语言程序设计教程 原文链接:/html/93317.shtmlC语言中的结构体类型变量文章类别:C语言程序设计 | 发表日期:09-08-25收藏到QQ书签 - 在日常生活中,我们常会遇到一些需要填写的登记表,如住宿表、成绩表、通讯地址等。在这些表中,填写的数据是不能用同一种数据类型描述的,在住宿表中我们通常会登记上姓名、性别、身份证号码等项目;在通讯地址表中我们会写下姓名、邮编、邮箱地址、电话号码、E - m a i l等项目。这些表中集合了各种数据,因此C引入一种能集中不同数据类型于一体的数据类型结构体类型。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。 在上面描述的各种登记表中,让我们仔细观察一下住宿表、成绩表、通讯地址等。 住宿表由下面的项目构成: 这些登记表用C提供的结构体类型描述如下:住宿表:struct accommodchar name20; / *姓名* /char sex; / *性别* /char job40; / *职业* /int age; / *年龄* /long number; / *身份证号码* / ;成绩表:struct scorechar grade20; / * 班级* /long number; / * 学号* /char name20; / *姓名* /float os; / *操作系统* /float datastru; / * 数据结构* /float compnet; / * 计算机网络* / ;通讯地址表:struct addrchar name20;char department30;/ * 部门* /char address30; / *住址* /long box; / * 邮编* /long phone; / * 电话号码* /char email30; / * E m a i l * /; 这一系列对不同登记表的数据结构的描述类型称为结构体类型。由于不同的问题有不同的数据成员,也就是说有不同描述的结构体类型。我们也可以理解为结构体类型根据所针对的问题其成员是不同的,可以有任意多的结构体类型描述。下面给出C对结构体类型的定义形式:struct 结构体名成员项表列;有了结构体类型,我们就可以定义结构体类型变量,以对不同变量的各成员进行引用。结构体类型变量的定义 结构体类型变量的定义与其它类型的变量的定义是一样的,但由于结构体类型需要针对问题事先自行定义,所以结构体类型变量的定义形式就增加了灵活性,共计有三种形式,分别介绍如下:1) 先定义结构体类型,再定义结构体类型变量:struct stu / *定义学生结构体类型* /char name20; / * 学生姓名* /char sex; / * 性别* /long num; / *学号* /float score3; / * 三科考试成绩* /;struct stu student1,student2;/ * 定义结构体类型变量* /struct stu student3,student4;用此结构体类型,可以定义更多的该结构体类型变量。2 ) 定义结构体类型同时定义结构体类型变量:struct dataint day;int month;int year; time1,time2;也可以再定义如下变量:struct data time3,time4;用此结构体类型,同样可以定义更多的该结构体类型变量。3) 直接定义结构体类型变量:structchar name20; / *学生姓名* /char sex; / *性别* /long num; / *学号* /float score3; / *三科考试成绩* / person1,person2; / *定义该结构体类型变量* /该定义方法由于无法记录该结构体类型,所以除直接定义外,不能再定义该结构体类型变量。结构体类型变量的引用 学习了怎样定义结构体类型和结构体类型变量,怎样正确地引用该结构体类型变量的成员呢?C 规定引用的形式为: . 若我们定义的结构体类型及变量如下:struct dataint day;int month;int year; time1,time2; 则变量time1和time2各成员的引用形式为:time1.day、time1.month、time1.year及time2.day、time2.month、time2.year,如图7-1所示。其结构体类型变量的各成员与相应的简单类型变量使用方法完全相同。结构体类型变量的初始化 由于结构体类型变量汇集了各类不同数据类型的成员,所以结构体类型变量的初始化就略显复杂。 结构体类型变量的定义和初始化为:struct stu / *定义学生结构体类型* /char name20; / * 学生姓名* /char sex; / * 性别* /long num; / *学号* /float score3; / * 三科考试成绩* /;struct stu student=liping,f,970541,98.5,97.4,95; 我们也可以通过C提供的输入输出函数完成对结构体类型变量成员的输入输出。由于结构体类型变量成员的数据类型通常是不一样的,所以要将结构体类型变量成员以字符串的形式输入,利用C的类型转换函数将其转换为所需类型。类型转换的函数是:int atoi(char *str);转换str所指向的字符串为整型,其函数的返回值为整型。double atof(char*str);转换str所指向的字符串为实型,其函数的返回值为双精度的实型。long atol(char*str);转换str所指向的字符串为长整型,其函数的返回值为长整型。使用上述函数,要包含头文件stdlib.h。对上述的结构体类型变量成员输入采用的一般形式:char temp20;gets();/*输入姓名*/student.sex=getchar();/*输入性别*/gets(temp);/*输入学号*/student.num=atol(temp);/*转换为长整型*/for(i=0;i3;i+)/*输入三科成绩*/gets(temp);student.score

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论