求解钢材切割的最佳订单
实例说明
本实例通过指针实现整数大小的比较。程序要求定义 3 个整型变量用于存储读入的 3 个整数。
另定义 3 个指向整型变量的指针变量,并利用它们实现将 3 个整型变量中的 3 个整数按值从小到
大顺序输出。
实例解析
指针的概念
指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用
指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能像汇编语言一样处理内存
地址,从而编出精练而高效的程序。
在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存
单元,不同的数据类型所占用的内存单元数不等,如整型量占 2 个单元,字符量占 1 个单元等。
为了正确地访问这些内存单元,必须为每个内存单元编上号,这样根据一个内存单元的编号即可
准确地找到该内存单元。内存单元的编号也叫做地址。因为根据内存单元的编号或地址就可以找
到所需的内存单元,所以通常也把这个地址称为指针。
内存单元的指针和内存单元的内容是两个不同的概念。可以用一个通俗的例子来说明它们之
间的关系。我们到银行去存取款时,银行工作人员将根据我们的账号去找存款单,找到之后在存
单上写入存款、取款的金额。在这里,账号就是存单的指针,存款数是存单的内容。对于一个内
存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容。
在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值
就是某个内存单元的地址或称为某内存单元的指针。设有字符变量 C,其内容为“K”(ASCII 码为
十进制数 75),C 占用了 011A 号单元(地址用十六进制数表示)。设有指针变量 P,内容为 011A,
这种情况称为 P 指向变量 C,或说 P 是指向变量 C 的指针。严格地说,一个指针是一个地址,是一
个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但通常把指针变量简称为指针。
既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其他数据结
构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都
是连续存放的,所以通过访问指针变量便可以取得数组或函数的首地址,也就找到了该数组或函
数。这样以来,凡是出现数组、函数的地方都可以用一个指针变量来表示,只要给该指针变量中
赋予数组或函数的首地址即可。在C语言中,一种数据类型或数据结构往往都占有一组连续的内
存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际
上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更
为清楚,表示更为明确。
指针变量的类型说明
对指针变量的类型说明包括 3 个内容。
(1)指针类型说明,即定义变量为一个指针变量。
(2)指针变量名。
(3)变量值(指针)所指向的变量的数据类型。
其一般形式为:
类型说明符 *变量名;
其中,*表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量
所指向的变量的数据类型。
例如“int *p1;”表示 p1 是一个指针变量,它的值是某个整型变量的地址。或者说 p1 指向一
个整型变量。至于 p1 究竟指向哪一个整型变量,应由向 p1 赋予的地址来决定。
再如:
staic int *p2; /*p2 是指向静态整型变量的指针变量*/
float *p3; /*p3 是指向浮点变量的指针变量*/
char *p4; /*p4 是指向字符变量的指针变量*/
应该注意的是,一个指针变量只能指向同类型的变量,如 p3 只能指向浮点变量,不能时而指
向一个浮点变量,时而又指向一个字符变量。
指针变量的赋值
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的
指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址值,决不能
赋予任何其他数据类型,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用
户完全透明,用户不知道变量的具体地址。C语言中提供了地址运算符“&”来表示变量的地址。
其一般形式为:
&变量名;
如&a 变示变量 a 的地址,&b 表示变量 b 的地址。变量本身必须预先声明。假设有指向整型
变量的指针变量 p,要把整型变量 a 的地址赋予 p 可以有以下两种方式。
(1)指针变量初始化的方法
int a;
int *p=&a;
(2)赋值语句的方法
int a;
int *p;
p=&a;
不允许把一个数赋予指针变量,故下面的赋值是错误的:
int *p;
p=1000;
被赋值的指针变量前不能再加“*”说明符,如写为“*p=&a”也是错误的(注意不同于初始
化的方法)。
指针变量的运算
指针变量只能进行赋值运算和部分算术运算及关系运算。
1.指针运算符
(1)取地址运算符&
取地址运算符&是单目运算符,其结合性为自右至左,其功能是取变量的地址。在 scanf 函数
及前面介绍指针变量赋值中,已经使用了&运算符。
(2)取内容运算符*
取内容运算符是单目运算符,其结合性为自右至左,用来表示指针变量所指的变量。在运
算符之后跟的变量必须是指针变量。需要注意的是,指针运算符*和指针变量说明中的指针说明符
*不同。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”
则是一个运算符,用以表示指针变量所指的变量,例如:
main()
{
int a=5,*p=&a;
printf ("%d",*p);
}
表示指针变量 p 取得了整型变量 a 的地址。本语句表示输出变量 a 的值。
2.指针变量的运算
(1)赋值运算
指针变量的赋值运算有以下几种形式。
① 指针变量初始化赋值,前面已介绍。
② 把一个变量的地址赋予指向相同数据类型的指针变量。例如:
int a,*pa;
pa=&a; /*把整型变量 a 的地址赋予整型指针变量 pa*/
③ 把一个指针变量的值赋予指向相同类型变量的另一个指针变量。例如:
int a,*pa=&a,*pb;
pb=pa; /*把 a 的地址赋予指针变量 pb*/
由于 pa,pb 均为指向整型变量的指针变量,因此可以相互赋值。
④ 把数组的首地址赋予指向数组的指针变量。
例如:
int a[5],*pa;
pa=a;错误!链接无效。数组名表示数组的首地址,故可赋予指向数组的指针变量 pa*/
也可写为:
pa=&a[0]; /*数组第一个元素的地址也是整个数组的首地址,也可赋予 pa*/
当然也可采取初始化赋值的方法:
int a[5],*pa=a;
⑤ 把字符串的首地址赋予指向字符类型的指针变量。
例如“char *pc;pc=“c language”;”或用初始化赋值的方法写为“char *pc=“C Language”;”这
里并不是把整个字符串装入指针变量,而是把存放该字符串的字符数组的首地址装入指针变量。
⑥ 把函数的入口地址赋予指向函数的指针变量。例如:
int (*pf)();pf=f; /*f 为函数名*/
(2)加减算术运算
对于指向数组的指针变量,可以加上或减去一个整数 n。设 pa 是指向数组 a 的指针变量,则
pa+n,pa-n,pa++,++pa,pa–,–pa 运算都是合法的。指针变量加或减一个整数 n 的意义是把指针指向
的当前位置(指向某数组元素)向前或向后移动 n 个位置。
应该注意,数组指针变量向前或向后移动一个位置和地址加 1 或减 1 在概念上是不同的。因
为数组可以有不同的类型,各种类型的数组元素所占的字节长度是不同的。如指针变量加 1,即
向后移动 1 个位置表示指针变量指向下一个数据元素的首地址,而不是在原地址基础上加 1。
例如:
int a[5],*pa;
pa=a; /*pa 指向数组 a,也是指向 a[0]*/
pa=pa+2; /*pa 指向 a[2],即 pa 的值为&pa[2]*/
指针变量的加减运算只能对数组指针变量进行,对指向其他类型变量的指针变量做加减运算
是毫无意义的。两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算,
否则运算毫无意义。
①两指针变量相减
两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。实际上是两个指针值
(地址)相减之差再除以该数组元素的长度(字节数)。例如 pf1 和 pf2 是指向同一浮点数组的两个指
针变量,设 pf1 的值为 2010H,pf2 的值为 2000H,而浮点数组每个元素占 4 个字节,所以 pf1-pf2 的
结果为(2000H-2010H)/4=4,表示 pf1 和 pf2 之间相差 4 个元素。两个指针变量不能进行加法运算。
② 两指针变量进行关系运算
指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的关系。
程序代码
#include <stdio.h>
// system("cls");/* 清屏 */
void clrscr(){
system("cls");/* 清屏 */
}
/* 主函数用于测试函数 trans() */
int main()
{
int x,y,z; /* 定义 3 个 int 型变量 */
int *xp = &x, /* 定义指针变量 xp,并赋值为 x 的地址,使 xp 指向 x */
*yp = &y, /* 定义指针变量 yp,并赋值为 y 的地址,使 yp 指向 y */
*zp = &z; /* 定义指针变量 zp,并赋值为 z 的地址,使 zp 指向 z */
int t;
clrscr();
printf("\nPlease input x,y,z:\n");
scanf("%d%d%d",xp,yp,zp); /* 通过变量的指针,为变量输入值 */
if(*xp>*yp) /* 通过指向变量的指针引用变量的值 */
{
t=*xp; /* 通过指向变量的指针引用变量的值 */
*xp=*yp;/* 通过指向变量 x 的指针 xp,引用变量 x 的值 */
*yp=t; /* 通过指向变量 y 的指针 yp,引用变量 y 的值 */
}
if(*xp>*zp) /* 通过指向变量的指针,引用变量的值 */
{
t=*xp; /* 通过指向变量 x 的指针 xp,引用变量 x 的值 */
*xp=*zp;/* 通过指向变量 x 的指针 xp,引用变量 x 的值 */
*zp=t; /* 通过指向变量 z 的指针 zp,引用变量 z 的值 */
}
if(*yp>*zp) /* 通过指向变量的指针,引用变量的值 */
{
t=*yp; /* 通过指向变量的指针,引用变量的值 */
*yp=*zp;/* 通过指向变量 y 的指针 yp,引用变量 y 的值 */
*zp=t;/* 通过指向变量 z 的指针 zp,引用变量 z 的值 */
}
printf("x = %d\ty = %d\tz = %d\n",x,y,z);
printf("\nPress any key to quit...\n");
getch();
return 0;
}
程序运行结果
文章来源:https://www.toymoban.com/news/detail-768906.html
归纳注释
本实例说明如何用指针实现数的大小比较。设 3 个变量分别为 x,y,z,与它们对应的 3 个指针
变量为 xp,yp,zp。两变量 x 和 y 之间的比较“x>y”,利用指向它们的指针 xp 和 yp 可以写成“*xp>*yp”。
与指针有关的类型说明如下所示(以整型为例)。文章来源地址https://www.toymoban.com/news/detail-768906.html
int i; /* 定义整型变量 i */
int *p; /* p 为指向整型数据的指针变量 */
int a[n]; /* 定义整型数组 a,它有 n 个元素 */
int *p[n]; /* 定义指针数组 p,它由 n 个指向整型数据的指针元素组成 */
int (*p)[n]; /* p 为指向含 n 个元素的一维数组的指针变量 */
int f(); /* f 为带回整型函数值的函数 */
int *p(); /* p 为带回一个指针的函数,该指针指向整型数据 */
int (*p)(); /* p 为指向函数的指针,该函数返回一个整型值 */
int **p; /* p 是一个指针变量,它指向一个指向整型数据的指针变量 */
到了这里,关于C语言例程:通过指针比较整数大小的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!