第九章指针类型
- 格式:doc
- 大小:65.50 KB
- 文档页数:21
9.1 名词解释(1)OODBS:是指面向对象数据库系统,它既具数据库管理的基本功能,又能支持面向对象的数据模型。
(2)ORDBS:基于对象关系数据模型的DBS称为对象关系数据库系统(ORDBS)。
(3)平面关系模型:传统的关系模型称为“平面关系模型”,它要求关系模式具有第一范式(1NF)性质,关系具有规范化的结构。
也就是规定属性值是不可分解的,即不允许属性值具有复合结构(元组或关系)。
(4)嵌套关系模型:是从平面关系模型发展而成的。
它允许关系的属性值又可以是一个关系,而且可以出现多次嵌套。
嵌套关系突破了1NF的定义框架,是“非1NF关系”。
(5)复合对象模型:在嵌套关系模型上进一步放宽要求。
在关系定义上,集合与元组不再有交替出现的严格限制,此时的关系中,属性类型可以是基本数据类型、结构类型(元组类型)或集体类型(即关系类型)。
(6)数据的泛化/细化:是对概念之间联系进行抽象的一种方法。
当在较低层上的抽象表达了与之联系的较高层上抽象的特殊情况时,就称较高层上抽象是较低层上抽象的"泛化",而较低层上抽象是较高层上抽象的"细化"。
(7)对象关系模型:在传统关系数据基础上,提供元组、数组、集合等更为丰富的数据类型及处理新数据类型操作的能力而形成的数据模型。
(注:传统关系模型只支持字符、数值、字串,布尔值等等基本数据类型及其处理功能)(8)类型级继承性:当继承性发生在类型级时,子类型继承了超类型的属性。
也就是说,超类型所具有的属性,在子类上也具有。
(9)表级继承性:继承性也可发生在表级,(就是元组集合上发生继承),子表继承超表全部属性,超表中每个元组最多可以与子表中一个元组对应,而子表中的每个元组在超表中恰有一个元组对应,并在继承的属性值上具有相同的值。
(10)引用类型:数据类型可以嵌套定义,在嵌套引用时,不是引用对象本身,而是个用对象标识符(即指针),这种指针被称为引用类型。
第一章概述1.C语言的特点①语言简洁、紧凑,使用方便、灵活。
共有32个关键字,9种控制语句。
②运算符丰富,公有34种运算符。
③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。
④具有结构化的控制语句(如if…else、while、do…while、switch、for)⑤语法限制不太严格,程序设计自由度大。
⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。
⑦生成目标代码质量高,程序执行效率高。
⑧可移植性好。
2.C语言的用途C虽不擅长科学计算和管理领域,但对操作系统和系统实用程序以及对硬件进行操作方面,C有明显的优势。
现在很多大型应用软件也用C编写。
Top of Page第二章数据类型、运算符与表达式1.C的数据类型C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2.常量与变量常量其值不可改变,符号常量名通常用大写。
变量其值可以改变,变量名只能由字母、数字和下划线组成,且第一个字符必须为字母或下划线。
否则为不合法的变量名。
变量在编译时为其分配相应存储单元。
3.整型数据整型常量的表示方法:十进制不用说了,八进制以0开头,如0123,十六进制以0x开头,如0x1e。
整型变量分为:基本型(int)、短整型(short int)、长整型(long int)和无符号型。
不同机器上各类数据所占内存字节数不同,一般int型为2个字节,long型为4个字节。
4.实型数据实型常量表示形式:十进制形式由数字和小数点组成(必须有小数点),如:0.12、.123、1230.0等。
指数形式如123e3代表123×10的三次方。
实型变量分为单精度(float)和双精度(double)两类。
在一般系统中float型占4字节,7位有效数字,double型占8字节,15~16位有效数字。
5.字符型数据字符变量用单引号括起来,如'a','b'等。
C语言指针的长度和类型详解C语言指针的长度和类型详解指针是C语言的精髓,以下是店铺搜索整理的关于C语言指针的长度和类型详解,对于初学者深入理解C语言程序设计有很好的参考价值,有需要的朋友可以参考一下!想了解更多相关信息请持续关注我们店铺!一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。
但是函数指针长度可能与数据指针的长度不同。
指针的长度取决于使用的机器和编译器,例如:在现代windows 上,指针是32位或是64位长测试代码如下:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<stddef.h>struct p{int n;float f;};int main(){struct p *sptr;printf("sizeof *char: %d ", sizeof(char*));printf("sizeof *int: %d ", sizeof(int*));printf("sizeof *float: %d ", sizeof(float*));printf("sizeof *double: %d ", sizeof(double*));printf("sizeof *struct: %d ", sizeof(sptr));return 0;}运行结果如下图所示:指针相关的预定义类型:① size_t:用于安全地表示长度② ptrdiff_t:用于处理指针算术运算③ intptr_t:用于存储指针地址④ uintptr_t:用于存储指针地址分述如下:一、size_t类型size_t 类型是标准C库中定义的,应为unsigned int,在64位系统中为long unsigned int。
第九章数组和指针1、有以下程序main(){ int a[]={2,4,6,8,10}, y=0, x, *p;p=&a[1];for(x= 1; x< 3; x++) y += p[x];printf("%d\n",y);}程序运行后的输出结果是A)10 B)11 C)14 D)152、有以下程序void sum(int a[]){ a[0] = a[-1]+a[1]; }main(){ int a[10]={1,2,3,4,5,6,7,8,9,10};sum(&a[2]);printf("%d\n", a[2]);}程序运行后的输出结果是A)6 B)7 C)5 D)83、有以下程序main(){int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;while(i++< 7) if(p[i]%2) j+=p[i];printf("%d\n",j);}程序运行后的输出结果是A)42 B)45 C)56 D)604、设有定义语句 int x[6]={2,4,6,8,5,7},*p=x,i;要求依次输出x数组6个元素中的值,不能完成此操作的语句是A)for(i=0;i<6;i++) printf("%2d",*(p++));B)for(i=0;i<6;i++) printf("%2d",*(p+i));C)for(i=0;i<6;i++) printf("%2d",*p++);D)for(i=0;i<6;i++) printf("%2d",(*p)++);5、有以下程序#include < stdio.h >main(){ int a[]={1,2,3,4,5,6,7,8,9,10,11,12,},*p=a+5,*q=NULL; *q=*(p+5);printf("%d %d\n",*p,*q); }程序运行后的输出结果是A)运行后报错 B)6 6 C)6 11 D)5 106、有以下程序段int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b;b=p[5];b中的值是A)5 B)6 C)8 D)97、已有定义:int i,a[10],*p;则合法的赋值语句是A)p=100; B)p=a[5]; C)p=a[2]+2; D)p=a+2;8、以下能正确定义一维数组的选项是A)int num []; B)#define N 100int num [N];C)int num[0..100]; D)int N=100;int num[N];9、有以下程序main(){ int p[7]={11,13,14,15,16,17,18},i=0,k=0;while(i< 7&&p[i]%2){k=k+p[i];i++;}printf("%d\n",k);}执行后输出结果是A)58 B)56 C)45 D)2410、有以下程序main(){ int x[8]={8,7,6,5,0,0},*s;s=x+3;printf("%d\n",s[2]);}执行后输出结果是A)随机值 B)0 C)5 D)611、若有定义:int aa[8];。
专升本C语言考试大纲第一章 C语言概述(一)课程内容1 C语言的简史与特点2 一个简单的C程序3 程序的编辑,编译,链接和运行(二)考核知识点与考核要求1.程序设计,要求达到“识记”层次。
2.C语言的字符集,要求达到“领会”层次。
第二章数据类型,运算符与表达式(一)课程内容1 C数据类型2 常量与变量3运算符与表达式(二)考核知识点与考核要求1.C数据类型,要求达到“识记”层次。
2.常量与变量,要求达到“领会”层次。
3.运算符与表达式,要求达到“简单应用”层次。
第三章顺序程序设计(一)课程内容1 C语句的概述2 赋值语句3 数据输入输出的概念及在C语言中的实现4 字符数据的输入输出5 格式输入与输出(二)考核知识点与考核要求1.C语句的概述,要求达到“识记”层次。
2.赋值语句,要求达到“简单应用”层次。
3.格式输入与输出,要求达到“综合应用”层次。
第四章选择结构程序设计(一)课程内容1 if语句2 switch语句(二)考核知识点与考核要求if语句、switch语句,要求达到“综合应用”层次。
第五章循环控制(一)课程内容1 while语句2 do—while语句3 for语句4 循环的嵌套5 break语句和continue语句(二)考核知识点与考核要求1.while语句、do—while语句、for语句、break语句和continue语句,要求达到“综合应用”层次。
2. 循环的嵌套,要求达到“简单应用”层次。
第六章数组(一)课程内容1 一维数组2 多维数组3 字符数组(二)考核知识点与考核要求1一维数组的定义、元素的引用和初始化,要求达到“综合应用”层次。
2. 多维数组的定义、元素的引用和初始化,要求达到“简单应用”层次。
3字符数组的定义、元素的引用和初始化,要求达到“综合应用”层次。
4.字符数组的输入输出、字符串处理函数,要求达到“简单应用”层次。
第七章函数(一)课程内容1 概述2 函数定义的一般形式3 函数参数和函数值4 函数的调用5 函数的嵌套调用6 函数的递归调用7 数组作为函数参数8 局部变量和全局变量9 变量的存储类别(二)考核知识点与考核要求1.函数的定义和调用方法,要求达到“领会”层次。
浙大版《c语言程序设计(第4版)》讲解《C语言程序设计》是国内C语言教材的重要书籍,高校中的计算机专业等都有教授。
浙大版《C语言程序设计(第4版)》是由著名计算机科学家袁春风编写的C语言教材,该书主要介绍了C语言基础、字符串、数组、指针、结构体、文件操作等内容。
本文将对该书内容做简要概括。
第一部分:C语言基础第一章:概述该章主要介绍了计算机语言的发展与演化,C语言的历史和主要特点,以及C语言的应用领域和发展前景。
第二章:初识C语言该章节主要介绍了C语言的基本概念,例如标识符、关键字、注释等。
并且结合一些简单的例子介绍了C语言的语法格式和执行规则。
第三章:数据类型该章节主要介绍了C语言的数据类型,包括整型、实型、字符型、布尔型等。
并且介绍了类型转换及其规则。
第四章:运算符与表达式该章节主要介绍了C语言的基本运算符及其优先级、结合性和作用。
并且通过实例来介绍了使用运算符和表达式的方法及注意事项。
第五章:分支结构该章节主要介绍了C语言中的分支结构,包括if、if-else、switch等,以及运用分支结构解决问题的方法和技巧。
第二部分:数组、字符串和指针第七章:数组该章节主要介绍了C语言中的数组,包括一维数组、二维数组等,并结合例子介绍了数组的定义、初始化、遍历、赋值等操作。
第八章:字符串该章节主要介绍了C语言中的字符串,包括字符串的定义、初始化、输入、输出等。
并且介绍了使用字符串解决问题的方法和技巧。
第九章:指针第三部分:函数与结构体该章节主要介绍了C语言中的结构体,包括结构体的定义、初始化、访问、结构体数组、结构体指针等。
并且介绍了结构体在程序中的应用。
第四部分:文件操作与其他第十二章:文件操作第十三章:其他语言特性与扩展该章节主要介绍了C语言扩展的特性,包括宏定义、预处理指令、变长参数等。
并且介绍了C语言与其他语言的异同点。
总结:《C语言程序设计(第4版)》是一本权威的C语言教材,该书系统全面地介绍了C语言的基本概念、语法格式、运算符、控制语句、数组、指针、函数、结构体、文件操作等方面的内容,让读者对C语言的掌握更加深入。
第九章指针指针是C语言的一个重要概念,也是C的一个重要特色。
正因为有了指针,C语言才可以灵活有效的表示复杂的数据结构,更方便地处理诸如内存、字符串、数组、函数等。
可以说,不掌握指针就不能掌握C的精华。
一、地址和指针的概念地址的概述1、存储器地址计算机所处理的数据,总是要存储在一定的存储介质上,例如内存。
而这些数据的存储,又是有一定先后顺序的。
因此我们通常将这些存储介质上的一个个用于存放数据的基本单元进行线性编址,即按照一定的顺序给每个存储单元(字节)一个编号,这个编号就是该单元的地址。
一般情况下,地址总是从0开始的一系列整数。
某个地址就代表某个存储单元,就如一个房间号Array码对应于一个实际的房间一样。
2、存储单元的内容这是不同于地址的另一概念,它是指某地址单元内具体存放的数据,如一个字符、一个整数、实数或一个字符串。
例:如右图100,101,102,…,205,206等即是地址;160单元的内容就是字符C,161单元的内容就是字符H,…,等。
3、变量的访问一般情况下,程序中的一个变量就对应存储器的若干个单元,对变量的访问可以简单地认为是通过变量名来对内存单元进行存取操作。
实际上,程序在编译之后,变量名已经转化为了与该变量对应的存储单元地址,因而对变量的访问就是通过地址对存储单元的访问。
1)直接访问按照变量地址来对变量进行存取的方式,称为直接访问方式。
例如:右表中对变量a的读取:printf(“%d”,a),其实是先找到a的地址160,然后从160开始读取一个字节的字符‘C’;同理用scanf(“%d”,&b)输入b的值时,在执行时,直接把从键盘输入的数据‘H’送入从地址为161开始的字节单元中。
2)间接访问通过另一变量间接获取某变量的地址,从而间接实现对原变量的访问的方式,称为间接访问方式。
例如:将变量a的地址160存放在另一个变量当中,见上表p=160,那么,对变量a的访问也可以为:先通过变量p的地址205找到该单元的数据160,再将160视为地址,该地址单元内容就是变量a的值(字符‘C’)。
9.1 指针类型的声明指针类型在任何语言中都是比较难以理解也是比较灵活的一种数据类型指针常是它所指的变量的内存地址。
声明指针类型的语法如下:Type〈指针类型标志符〉=^〈基类型〉;其中,指针类型标志符即是指针类型名,基类型可以是简单类型,如整型,实型,字符型等,也可以是结构类型,如数组,记录,集合等。
指针类型声明示例:TypeTr = ^Integer;PI = ^real;Word = RecordName: String[10];Age: Integer;Scores: Real;End;BytePtr = ^Byte;WordPtr = ^Word;上例中,声明了4个指针类型。
其中,BytePtr是一个指向字节类型的数据;而WordPtr是一个指向记录类型Word的数据Object Pascal不要求基类型一定是要在前面已声明的,也可以是一个标志符,然后在同一个模块内声明基类型。
声明了指针类型后,就可以声明指针类型的变量,如:VarBP: BytePtr;WP: WordPtr;或:VarBP: ^Bytel;指针所指的基类型可以是简单类型,也可以是构造类型,如:TypeStudent = RecordName: String;Age: Integer;Sex: (Man, Woman);End;VarStuPtr: ^Student;上例中,声明了一个指向记录类型的Student指针变量StuPtr,以后程序中就可以使用StuPtr^来表示记录类型Student的动态变量。
要访问其中的Name字段,可以写成StuPtr^.Name。
这里介绍动态变量的概念,动态变量的构成是用指针类型的变量标志符后加一个“^”符号,就构成指针所指向的基类型的动态变量,如上例中的StuPtr^就是Student的动态变量。
与通常的变量一样,一旦声明了指针变量,编译器将给指针分配存储单元,但存储单元中的值尚未确定。
要想让指针指向确定的地址,必须通过赋值语句或New标准过程来实现。
如:Label 1,2,3,4,5;VarM: Integer;X1, X2: ^Integer;Begin1: M:= 20;2: X1:= @M;3: New(X2);4: X2^:= 150;5: Dispose(X2);End;执行上述语句段时,若编译器给变量M分配的内存地址为$,那么,执行标号为3的语句后,指针变量X1和变量M的关系如下:X1 $$20即指针变量X1的值为变量M的内存地址。
执行语句3时,编译器首先在内存中分配适宜存放指针X2所指向的数据(这里为正数)的一组存储单元(假设为$01100A),然后将这组单元的首地址写入指针X2。
这里X2^称为动态存储变量。
使用New建立了动态存储变量后,它的值是不确定的,以后可以将某个整数值存储在该单元中。
X2 $01100A$01100A?X2 $01100A$01100A150执行语句5后,标准过程Dispose将释放由New分配的内存单元。
在程序段中,标号过程New和Dispose应配对使用。
当用New分配的动态存储空间不再使用时,应及时地释放所分配的存储空间,避免发生错误。
如果分配存储空间时内存不够,将触发一个异常错误(EoutOfMemory),程序随即终止。
上例中的运算符“@”和“^”专用于指针类型,分别称为取址和应用运算符。
9.2 指针的运算Delphi提供了专门的过程和函数来操作指针,这些过程和函数是:New过程,@操作符,PTR函数,GetMem过程1)New过程New是Object Pascal中的标准例程(在System单元中声明),用于在应用程序中为动态变量分配一块区域,并把该区域的地址赋给指针变量。
所分配区域的大小由指针所指的类型决定。
如果分配存储空间时内存不够,将触发一个异常错误(EoutOfMemory)New过程的声明如下:Procedure New(Var P: Pointer);其中P是一个指针变量,调用了New过程后,程序就可以用P^作为指针所指类型的动态变量。
相应地,当程序不再需要使用动态变量时,就应当调用标准例程Dispose删除New创建的动态变量,并释放所分配的空间。
程序示例如下:TypePlisEntry =^ TlistEntry;TlistEntry = RecordNext : PlistEntry;Text : String;Count: Integer;End;VarList, P: PlistEntry;Begin……New(P);P^.Next := List;P^.Text := ’Hellow world’;P^.Count := 1;List:= P;Dispose(P);……End;2)@操作符@操作符是一个一元操作符,用于获得操作数的的地址,@后面的操作数可以是变量,过程,函数或类型中的方法,程序示例如下:Procedure ChangeValue(X: Integer);VarIntPtr: ^Integer;BeginIntptr:= @X;Writeln(IntPtr^);IntPtr^:= 20;End;如果主程序如下:VarParam: Integer;BeginParam:= 10;ChangeValue(Param);Writeln(Param);{10}End;上例中,ChangeValue过程首先声明了一个指向整数类型数的指针IntPtr,然后用@操作符取出X的地址赋予IntPtr指针,并显示IntPtr指针指向的数,最后改变这个数。
3)PTR函数PTR 函数是Pascal中的标准例程,用于把一个指定的地址转换为指针,语法为:Function Ptr(Address: Integer): pointer;其中,Address是一个整数,用于表示一个32位地址,函数执行的结果是把32为地址转化为指针。
4)GetMem过程GetMem 过程也是Pascal中的标准例程,类似于New,用于在应用程序中堆栈中为动态变量申请一块指定大小的区域,并把该区域的地址赋予指针变量。
语法为:Procedure GetMem(var P:Pointer;Size:Integer);其中P是一个指针变量,Size指定区域的字节数。
所分配区域的大小由指针变量P的基类型决定。
如果在应用程序堆栈中没有足够的内存空间供分配,将触发EOutOfMemory异常。
如果程序不再需要该动态变量时,可以调用标准例程FreeMem释放该变量分配的内存空间。
程序如下:VarF: file;Size: Integer;Buffer: Pchar;BeginAssignFile(F, ’test.txt’);Reset(F,1);TrySize:= FileSize(F);GetMem(Buffer, Size);TryBlockRead(F, Buffer^,Size);ProcessFile(Buffer, Size);FinallyFreeMem(Buffer);End;FinallyCloseFile(F);End;End;上例打开一个名字Test.txt为的文件,并把文件读入动态分配的缓冲区,缓冲区大小为文件的大小,然后对文件进行处理,最后释放动态分配的缓冲区,并关闭文件。
Pascal中有一个特殊的保留字nil,这是一个空指针常量,当指针的值为nil时,表示指针当前没有指向任何动态变量。
值为nil的指针变量不能访问动态变量。
指针变量除了能被赋值外,还能进行相等或不相等的比较,比较只限于类型兼容的指针变量之间。
当两个指针指向同一个对象时,指针才相等。
9.3 无类型指针无类型指针是指指针变量在声明时没有指明基类型。
无类型指针在声明中只使用Pointer。
如:VarPAnyPOint: Pointer;指针PAnyPOint可以指向任何变量类型。
无类型的指针的作用是它可以指向任何类型,但是,不能用指针变量符后加“^”的形式引用它的动态变量。
要引用Pointer类型指针指向的变量,应先将其转换为确定的类型,如:TypeTpinte: ^Integer;VarM, N: Integer;P: Pointer;Pt: Tpinte;BeginM:= 150;P:= @M;Pt:= Tpinte(P)N:= Pt^;End;9.4 字符指针类型字符指针类型即PChar 数据类型,是一个指向以NULL(不是零)字符结尾的字符串的指针。
这种类型主要用于与外部函数中如在Windows API 中所用的函数兼容。
与Pascal字符串不同,Windows和C字符串没有一个长度字节。
取而代之的是它们0字节索引开始,以一个NULL结束。
Pascal RTL字符函数根据长度决定存储在字符串变量中的字符数目。
在Pascal中使用这些函数就需要PChar类型变量。
内存将分配给变量并被所需函数使用。
除了PChar外,Delphi还包含PAnsiChar和PWideChar数据类型。
▪PAnsiChar数据类型是一个指向以NULL字符结尾的AnsiChar字符串的指针,在Delphi中,PCHAR等同于PAnsiChar。
▪PWideChar数据类型是一个指向以NULL字符结尾的WideChar字符串的指针,用于UniCode字符集。
实际上,PAnsiChar和PWideChar数据类型的定义为:TypePansiChar = ^AnsiChar;PwideChar = ^WideChar;Pchar = PansiChar;字符串类型与PChar类型赋值兼容,即一个字符串可以直接赋给一个PChar类型的变量,如:varP: Pchar;……BeginP:= ’Hello World’;End;9.5 动态存储结构的实现指针常用于描述动态存储结构的实现。
动态存储结构中常用的有链表,堆栈,队列等存储结构。
可以把堆栈和队列看成特殊的链表本节只是简单介绍一下如何利用指针和记录来实现链表结构。
链表是一组元素的序列,在这个序列中每个元素总是与他前面的元素相链接(第一个元素除外)。
这种关系可以通过指针来实现。
链表中的元素称为节点,第一个节点称为表头,最后一个称为表尾。
指向表头的指针称为头指针,在这个头指针里存放着表头的地址。
节点一般用记录来描述,描述节点的记录至少含有两个域,一个用来存放数据,该域的类型根据要存放的数据而定,称为值域;另一个用来存放下一个节点的地址,称为指针域。
表尾不指向任何节点,其指针的值为NIL。
如图:应用Object LPascal的指针和记录类型,图示的链表可以声明如下:TypeNode:= Record;Data: Char;Next: ^Node;End;VarHead: ^Node;或者:TypeLink = ^Node;Node:= RecordData: Char;Next: ^Node;End;VarHead: Link;链表中相邻节点的地址是不连续的。