C语言例程:通过指针比较整数大小

这篇具有很好参考价值的文章主要介绍了C语言例程:通过指针比较整数大小。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


求解钢材切割的最佳订单

实例说明

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

程序运行结果

c语言怎么比较整型和指针,C/C++,c语言,算法,数据结构

归纳注释

本实例说明如何用指针实现数的大小比较。设 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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言基础教程】函数指针与指针大小

    在C语言中,指针是一项强大的工具,用于处理内存中的数据。除了常见的指向变量和数组的指针,C语言还支持函数指针,它是一个指向函数的指针。本文将深入探讨函数指针的概念以及指针的大小在C语言中的重要性。 函数指针 是指向函数的指针变量。它允许我们在运行时

    2024年02月05日
    浏览(34)
  • 没有jodatime,rust里怎么比较两个日期(时间)的大小呢?

    在 Rust 中,比较两个日期的大小有多种方法。以下是列举的四种常见方法: 这些方法中,前两种使用 PartialOrd 和 Ord trait 进行日期比较,第三种结合了 PartialEq 和 Eq trait,而第四种方法使用 DateTime 类型的 timestamp 进行比较。

    2024年02月14日
    浏览(49)
  • 第三篇c语言:比较三个数的大小(详解)

      不好意思,昨天败在了和床的决斗中,今天再度开始,上题: 输入三个数,按由小到大的次序排序并输出。 输入样例: 1  9  0 输出样例: 0  1  9 代码如下: 运行结果如下:    这个题很简单,但是用到了if语句和交换算法,特别是自学的同学可能会懵逼,不会就去搜,

    2024年02月06日
    浏览(37)
  • 数据结构(C语言):两个字符串比较大小

    在写这篇文章之前,作者想先和大家分享一个小故事。如果你不想看这个小故事的话,可以直接跳到第二点哦。 为了锻炼自己的编码能力,平时作业和实验题的代码我都是不看书、不看老师的PPT,按照自己的思路一行一行敲出来的。同时也不太理解那些照着书敲代码的同学。

    2024年02月03日
    浏览(44)
  • C语言比较两个数的大小,输出较大的数

    第一种: #includestdio.h int Max(int a,int b)   //创建一个函数对a b进行大小比较,输出最大值 {     if (a b)         return b;     else         return a; } int main() {     int x, y,max;     scanf(\\\"%d%d\\\", x, y);     max=Max(x, y);     printf(\\\"较大值=%d\\\", max);     return 0; } 第二种: #includestd

    2024年02月05日
    浏览(42)
  • C语言中比较两数的大小——三种方法

    定义a = 10,b = 20,以下为三种比较方式: 一、if-else法 通过在函数中运用 if-else语句 来求出大的数,运行结果如下:  二、三目运算符法 通过 三目运算符 ( ? :) 来求出大的数,运行结果如下:  三、调用函数法 通过调用 MAX函数 来求出大的数,运行结果如下: 在C中比较两

    2024年02月13日
    浏览(58)
  • 【C语言初阶】带你轻松掌握指针基础知识(1)——指针的定义,类型,大小

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,最近刚回家有点懒,从今天开始恢复更新并开始更新新的刷题系列,我们先继续更新0基础入门C语言的内容,今天给大家带来的是指针方面的内容,但由于是初阶,一些高级的用法我们放在进阶篇再讲

    2024年02月12日
    浏览(43)
  • C语言——三目运算符的进阶用法,比较三个或者四个数的大小

    1、三目运算符也叫条件运算符,结合方向是从右至左。 2、三目运算符仅此一个。 3、基本形式:      表达式1 ? 表达式2 :  表达式3 4、比较原理:表达式1是否为真,如果为真,执行表达式2,否则执行表达式3. 例:a = 4 3 ? 1 : 0 ;   a的值为1. 5、如果在表达式中含有其他运算符

    2024年02月08日
    浏览(37)
  • 用C语言解决三个整数比大小,x,y,z三个整数求最小整数,从键盘上输入3个不同的整数×,y,Z,请设计一个算法找出其中最小的数,并画出流程图。

    用C语言解决三个整数比大小,x,y,z三个整数求最小整数,从键盘上输入3个不同的整数×,y,Z,请设计一个算法找出其中最小的数,并画出流程图。 以下是一个用C语言解决三个整数比大小的示例代码: 流程图如下所示: 开始 输入三个不同的整数 x, y, z 设 min = x 如果 y min,则 m

    2024年02月07日
    浏览(42)
  • 【C语言深度解剖】float变量在内存中存储原理&&指针变量与“零值”比较

    大家好好我是沐曦希💕 根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式: (-1)^S * M * 2^E (-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。 M表示有效数字,大于等于1,小于2。 2^E表示指数位。 例如: 十进制中的5.0转换成二进制

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包