C语言数据类型指针.pptx
《C语言数据类型指针.pptx》由会员分享,可在线阅读,更多相关《C语言数据类型指针.pptx(100页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、整型数据 类型类型 类型说明符类型说明符 长度长度 数的范围数的范围 基本型基本型 intint 2 2字节字节 -32768-327683276732767 短整型短整型 short 2short 2字节字节 -2-215152 21515-1-1 长整型长整型 long long 4 4字节字节 -2-231312 23131-1-1 无符号整型无符号整型 unsigned unsigned 2 2字节字节 0 06553565535 无符号短整型无符号短整型 unsigned short unsigned short 2 2字节字节 0 06553565535 无符号长整型无符号长整型
2、unsigned long unsigned long 4 4字节字节 0 0(2 23232-1-1)第1页/共100页类型类型 位数位数 数的范围数的范围 有效数字有效数字float float 32 32 10 10-37-37 101038 38 6 6 7 7 位位doubledouble型型 6464 10 10-307-307 1010308308 15 15 1616位位long double 128 10long double 128 10-4931-4931 10104932 4932 1818 1919位位浮点型数据浮点型分为单精度(float型)、双精度(double型
3、)和长双精度型(long double)三类形式。第2页/共100页字符型数据 单引号包含的一个字符是字符型常量,如a双引号包含的字符序列是字符串常量,如“Hello”规定:在每一个字符串常量的结尾加一个 作为字符串结束标志,系统据此判断字符串是否结束。如:如:如果有一个字符串常量”,实际上在内存中是:CHINA0第3页/共100页特殊字符n 换行t 横向跳格r 回车 反斜杠ddd ddd表示1到3位八进制数字xhh hh表示1到2位十六进制数字第4页/共100页数组定义:类型说明符 数组名常量表达式 下标是从0开始的举例:一维数组:int int a a1010;二维数据:float a34
4、,b510float a34,b510 字符串:char c char c1010=China=China 数组第5页/共100页指针类型 内存区的每一个字节有一个编号,这就是“地址地址”。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。(1)按变量地址存取变量值的方式称为“直接访问直接访问”(,);(,);;例如:例如:第6页/共100页第7页/共100页(2)“间接访问间接访问”的方式:将变量的地址存放在另一个变量中,这种变量就是指针变量。指针变量的定义:指针变量的定义:int*i_pointer 指针变量的赋值指针变量的赋值:i_pointer=&i 间接
5、存取方式:先找到存放“的地址”的变量i_pointer,从中取出的地址(2000),然后到2000、200字节取出的值()。第8页/共100页一个变量的地址称为该变量的“指针指针”。例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量指针变量”。上述的i_pointer就是一个指针变量。1、指针、指针和指针变量的定义:和指针变量的定义:指针变量的值(即指针变量中存放的值)是地址(即指针)。请区分“指针”和“指针变量”这两个概念。第9页/共100页基基类型类型 *指针变量名指针变量名;float *pointer_1;/指向float型变量的指针
6、变量char *pointer_2;/指向字符型变量的指针变量定义一个指针变量指针变量赋值pointer_;pointer_;注意:指针变量前面的“*”,表示该变量的类型为指针型变量。如指针变量名是pointer_1,而不是*pointer_1。第10页/共100页例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main()int*1,*2,*,;scanf(,);1;if();printf(=,=,);printf(max=,min=,*1,*2);第11页/共100页运行情况如下:运行情况如下:,当输入,时,由于,
7、当输入,时,由于,将和交换将和交换。交换前的情况见图。交换前的情况见图(),交换后见图()。(),交换后见图()。第12页/共100页第13页/共100页2、指针变量作为函数参数指针变量作为函数参数例例10.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出#include void main()void swap(int*p1,int*p2);/函数声明int,;/整型变量int*pointer_,*pointer_;/指针变量 scanf(,);pointer_;pointer_2;if(swap(pointer_,pointer_2);printf(,);第14页/共100
8、页void swap(int*,int*)int temp;temp*1;*;*temp;第15页/共100页第16页/共100页例例10.输入、输入、3个整数,按大小顺序输出个整数,按大小顺序输出#include void main()void exchange(int*1,int*2,int*3);int ,*,*,*;scanf(%,%,%,&,&,&);exchange(,);printf(,);第17页/共100页void exchange(int*,int*,int*)void swap(int*,int*);if(*)swap(,);if(*)swap(,);if(*swap(,
9、);void swap(int*,int*)int temp;temp*;*;*temp;第18页/共100页定义定义一个指向数组元素的指针变量:;/定义为整型数组 *;/定义为指向整型变量的 指针变量对该指针变量赋值赋值:;/把元素的地址赋 给指针变量。3、数组元素的指针、数组元素的指针 第19页/共100页引用一个数组元素,可以用:()下标下标法法 如如形式;形式;()指针指针法法 如如*()或或*()其中是数组名,是指向数组元素的指针变量,其初值。第20页/共100页例例10.5 输出数组中的全部元素输出数组中的全部元素 假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:第21
10、页/共100页(1)下标法下标法#include void main()int;int;for(;)scanf(,);printf();for(;)printf(,);例例10.5 输出数组中的全部元素输出数组中的全部元素 假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:第22页/共100页(2)通过数组名计算数组元素地址,找出元素的值。#include voidmain()int;int;for(;)scanf(,);printf();for(;)printf(,*();第23页/共100页(3)用指针变量指向数组元素。#include void main()int;int *,
11、;for(;)scanf(,);printf();for(;();)printf(,*);第24页/共100页例例10.通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。有人编写出以下程序:有人编写出以下程序:#include void main()int*,;for(;)scanf(,);printf();for(;,)printf(,*);第25页/共100页这个程序乍看起来好像没有什么问题。有的人即使已被告知此程序有问题,还是找不出它有什么问题。我们先看一下运行情况:1 2 3 4 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259
12、8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 第26页/共100页解决这个问题的办法,只要在第二个循环之前解决这个问题的办法,只要在第二个循环之前加一个赋值语句:加一个赋值语句:;#include void main()int*,;for(;)scanf(,);printg();p=a;for(;,)printf(,*);第27页/共100页C语言调用函数时虚实结合的方法:当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址。归纳起来,如果有一个实参数组,想在函数中改变此数组中的
13、元素的值,实参与形参的对应关系有以下种情况:第28页/共100页(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void main()void (int ,int)int;(,);第29页/共100页(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void()void(int*,int)int ;(,);(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void main()void(int*,int)int,*p=a;(p,);第30页/共100页(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void main()v
14、oid(int x,int),*p=a;(p,);第31页/共100页#include void main()void inv(int*,int);int,*;printf(The original array:n);for(;,)scanf(,);printf();inv(,);/*实参为指针变量实参为指针变量*/printf(The array has been inverted:);for(;)printf(,*);printf();第32页/共100页void inv(int*,int)int,temp,*,*;();for(;,)emp*;*;*temp;return;第33页/共1
15、00页指向二维数指向二维数组元素的指针变量组元素的指针变量例例10.11 10.11 用指针变量输出二维数组元素的值用指针变量输出二维数组元素的值#include void main()int 341,3,5,7,9,11,13,15,17,19,21,23;int*;for(;)()printf();printf(,*);运行结果如下:1 3 5 7 9 11 13 1519 21 23 第34页/共100页可将程序最后两个语句改为可将程序最后两个语句改为printf(addr,value2,*);在TC+环境下某一次运行时输出如下:,第35页/共100页用用指向数组的指针作函数参数指向数组
16、的指针作函数参数例例10.13 有一个班,个学生,各学门课,计算总有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩平均分数以及第个学生的成绩。用。用函数函数求总平均成绩,用函数找出并输出求总平均成绩,用函数找出并输出第个学生的成绩。第个学生的成绩。第36页/共100页#include void main()void average(float*p,int n);void search(float(*p)4,int n);float score34=65,67,70,60,80,87,90,81,90,99,100,98;average(*score,12);*求12个分数的平均分*
17、search(score,);*求序号为的学生的成绩*第37页/共100页void average(float*,int)float*_;float,;_;(;_;)(*);printf(average,aver);第38页/共100页void search(float(*)4,int)/*p是指向具有4个元素的一维数组的指针*/int;printf(the score of No.%are:,);for(;)printf(5.2,*(*();程序运行结果如下:.第39页/共100页4、字符串与指针字符串与指针例例 10.5 定义一个字符数组,对它初始化,定义一个字符数组,对它初始化,然后输出
18、该字符串然后输出该字符串#include void main()char string !;printf(,);(1)用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。第40页/共100页(2)用字符指针指向一个字符串用字符指针指向一个字符串 可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。例例106 定义字符指针定义字符指针#include void main()charstring !;printf(,);第41页/共100页例例10.10.7 7 将字符串复制为字符串将字符串复制为字符串 对字符串中字符的存取,可以用下标方法,也
19、可以用指针方法#include void()char am a boy,20;int;for(;*()!;)*()*();*();printf(string a is:,);printf(:);for(;!;)printf(,);printf();第42页/共100页设指针变量,用它的值的改变来指向字符串中的不同的字符。例例10.8 用指针变量来处理例用指针变量来处理例107问题。问题。#include void main()char =I am a boy.,20,*p1,*p2;int;for(;*!;p1,p2)第43页/共100页*;*;printf(string is:,);prin
20、tf(:);for(;!;)printf(,);printf();程序必须保证使和同步移动。第44页/共100页第45页/共100页例例1019 用函数调用实现字符串的复制用函数调用实现字符串的复制#include void main()void copy_string(char from,char to);char a=am a teacher;char =you are a student;printf(“string a=string,);printf(copy string a to string b:n);copy_string(,);printf(nstring a=%snstri
21、ng b=%sn,a,b);(1)用字符数组作参数用字符数组作参数第46页/共100页void copy_string(char from,char to)int;while(!);程序运行结果如下:copy string a to string b:第47页/共100页()()形参用字符指针变量形参用字符指针变量#include void main()void copy_string(char*,char*);char*am a teacher.;char*you are a student;printf(string a=,);printf(copy string a to string
22、b:n);_(,);printf(nstring a=%snstring b=%sn,a,b);第48页/共100页void copy_string(char*,char*)for(;*from!;from,to)*;*;虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们二者之间是有区别的,不应混为一谈,主要有以下几点:第49页/共100页(1)字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。(2)赋值方式。对字符数组只能对各个元素赋值,不 能用以下办法对字符数组赋值。char str;str
23、 !;而对字符指针变量,可以采用下面方法赋值:char*;!;但注意赋给的不是字符,而是字符串第一个元素 的地址。第50页/共100页(3)对字符指针变量赋初值:char*love China!;等价于 char*;!;而对数组的初始化:char str love China!;不能等价于 char str;str !;第51页/共100页(4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋予一个地址值,则它并未具体指向一个确定的字符数据
24、。如:char str;scanf(,str););是可以的。而常有人用下面的方法,目的是想输入一个字符串,虽然一般也能运行,但这种方法是危险的:char*;scanf(,);,);第52页/共100页应当这样:应当这样:*,;(,);(5)指针变量的值是可以改变的,如:例例10.0改变指针变量的值改变指针变量的值#include void()char*I love China!;printf(,);第53页/共100页需要说明,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。例101#include voidmain()char*love hin
25、a!;int;printf(“The sixth character is%cn,a5);for(;!;)printf(,);第54页/共100页5、指向函数的指针指向函数的指针一个函数在编译时被分配给一个入口地址,这个函数的入口地址就称为函数的指针函数的入口地址就称为函数的指针。它的原理可以简述如下:有一个函数(假设函数名为sub),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量。在调用函数sub时,实参为两个函数名和,给形参传递的是函数和的地址。这样在函数中就可以调用和函数了。第55页/共100页例例10.10.3 3 设一个函数设一个函数processprocess,在调
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 数据类型 指针
限制150内