目录

  • 求解钢材切割的最佳订单
    • 实例说明
    • 实例解析
      • 指针的概念
      • 指针变量的类型说明
      • 指针变量的赋值
      • 指针变量的运算
  • 程序代码
  • 程序运行结果
  • 归纳注释

求解钢材切割的最佳订单

实例说明

本实例通过指针实现整数大小的比较。程序要求定义 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;
}

程序运行结果

归纳注释

本实例说明如何用指针实现数的大小比较。设 3 个变量分别为 x,y,z,与它们对应的 3 个指针
变量为 xp,yp,zp。两变量 x 和 y 之间的比较“x>y”,利用指向它们的指针 xp 和 yp 可以写成“*xp>*yp”。
与指针有关的类型说明如下所示(以整型为例)。

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语言例程:通过指针比较整数大小相关推荐

  1. 自己实现了一个C语言例程,加深对宏、大小端、typeof宏、offsetof宏、指针变量、结构体、联合体的理解

    如题所述,最近时间在复习C语言.自己实现了一个C语言例程,以加深对宏.大小端.typeof宏.offsetof宏.指针变量.结构体.联合体的理解.关于细分知识后续有空再填充- swap宏的使用: 对应 ...

  2. C语言zh字符串指针的大小,C语言的一些小技巧,小知识

    1.用if(!strcmp(s1, s2)) 比较两个字符串等值,是否是个好风格? 这并不是个很好的风格, 虽然这是个流行的习惯用法.如果两个字符串相等, 这个测试返回为真, 但! ("非& ...

  3. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

  4. C语言创建指针需要给大小吗,如何用c语言创建一个指针(示例代码)

    正如我们所知,在c语言中,char指针逐字节遍历内存,即每次1字节,每次整数指针4字节(在gcc编译器中),每次2字节(在TC编译器中). 例如: char *cptr; // if this poi ...

  5. c语言:(指针)实现输入三个整数从小到大排序

    c语言:(指针)实现输入三个整数从小到大排序 #include<stdio.h> #include<stdlib.h> #include<string.h> #in ...

  6. c语言:(指针)有n个整数,使前面各数顺序向后移动m个位置

    c语言:(指针)有n个整数,使前面各数顺序向后移动m个位置 #include<stdio.h> #include<stdlib.h> int main(){void move( ...

  7. 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

    文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...

  8. c语言 比较4个整数大小,c语言编程 输入4个整数,要求由小到大输出

    c语言编程 输入4个整数,要求由小到大输出 答案:4  信息版本:手机版 解决时间 2019-10-05 15:46 已解决 2019-10-05 12:14 输入4个整数,要求由小到大输出 因为我是 ...

  9. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

最新文章

  1. 基于SpringAop 的统一验证
  2. python怎样给对象赋值_Python对象赋值、浅拷贝和深拷贝
  3. python中 是什么运算符_Python中什么是算术运算符、赋值运算符和复合运算符?...
  4. CCS6.2超详细使用方法
  5. (素材源代码) 猫猫学iOS 之UIDynamic重力、弹性碰撞吸附等现象牛逼Demo
  6. vb.net 弹出对话框 修改按钮名_Microsoft Excel怎么批量快速修改批注?
  7. python中factor函数_Python基础教程
  8. msp430项目编程44
  9. springmvc请求返回一个字符_response 返回 带双引号 的字符串解决办法 springmvc
  10. python 网络爬虫 第一天
  11. java虚拟机:虚拟机栈
  12. 【Axure9.0原型实战(一)】Axure9.0的元件库的使用、导入、制作、路径等操作方法与技巧(附Axure元件库大全)
  13. CDA LEVEL I分数占比解读,看懂这些,考试更容易拿分
  14. 基础资料表:行政区划、车型库、行业类别 可下载
  15. 一个单调递增的数组 被人随机拿出一个数 你怎么找到这个数
  16. 更新极路由器1S,HC5661A刷breed再刷老毛子华硕教程
  17. 计算机取小数点后的小数 公式,(excel表格公式计算后取小数点后的位数)excle自己打几位小数...
  18. vue外卖十九:商家详情-底部购物车组件,购物车相关vuex状态设计、相关计算、清空购物车+滚动购物车
  19. ImageJ实践——测量大小/长短(以细胞为例)
  20. 炔烃+叠氮“点击化学”(Click chemistry)试剂,你值得拥有

热门文章

  1. cocos2d-x 在simulator中运行闪退显示thread 1:breakpoint 1.1的解决方法
  2. 【笔记】Attention-based Memory video portrait matting
  3. 深圳python编程培训哪个好
  4. 俞敏洪 马云 史玉柱 牛根生
  5. 什么是帕累托图?有什么用?
  6. Python数据分析高薪实战第十天 数据绘图进阶与实战
  7. Python+selenium(二)
  8. 抖音X-Gorgon算法,签名设备注册,as,mas,cp
  9. 计算机术语mis指什么意思,在计算机行业中mis是指什么
  10. 齐岳新推红色磷光铱配合物Ir(ppy)2(NBT)|红色铕配合物Eu(DBM)3(FPIP)、Eu(DBM)3(EFPIP)