C语言——地址算数运算

简介: 算数运算

当C语言中的指针执行数组元素时,C语言允许对指针进行算术运算。

指针运算

C语言支持3种格式的指针算术运算,包括指针加上整数,指针减去整数和两个指针相减。同时还可以用关系运算符进行指针比较。

  • 指针p加上整数j表示指针向后移动j个单位(每个单位大小为指针p的类型所占的字节数),指向p原先指向的元素后的第j个元素。若p指向数组a[i],则p+j指向a[i+j]
  • 指针p减去整数j表示指针向前移动j个单位,指向p原先指向的元素前的第j个元素。若p指向数组a[i],则p-j指向a[i-j]
  • 两个指针相减,得到的是指针之间元素的个数。若指针p指向a[i],指针q指向a[j],则p-q等于i-j
  • 指针的比较依赖于指针所指向的两个元素的相对位置。若指针p指向a[i],指针q指向a[j],pq的比较结果由ij的大小决定。

因此适用于指针运算的运算符包括算术运算符+-,赋值运算符和复合赋值运算符(=+=,’-=’,++--)和所有的关系运算符。

/**************************************

* pointer_5.c                        *

*                                    *

* C语言中的指针运算                  *

**************************************/

#include <stdio.h>

#define N 10

intmain()

{

 inta[N], sum, *p;

 inti=0;

 printf("请输入%d个整数:", N);

 for (;i<N; i++)

 {

   scanf("%d", a+i);

 }

 p=a;

 sum=0;

 for (i=0; i<N; i++)

 {

   sum+=*p;

   p++;

 }

 printf("这%d个数的和为%d\n", N, sum);

 return0;

}

网络异常,图片无法展示
|

C语言的间接寻址运算符*常和++--运算符一起使用,具有以下四种不同的形式:

表达式 含义
p++或(p++) 首先计算表达式的值为*p,然后p自增1
(*p)++ 首先计算表达式的值为p,然后p自增1
++p或(++p) 首先将p自增1,然后计算表达式的值为*p
++p或++(p) 首先将(p)自增1,然后计算表达式的值为(p)

/**************************************

* pointer_6.c                        *

*                                    *

* C语言中的自增自减和间接寻址运算符  *

**************************************/

#include <stdio.h>

#define N 10

intmain()

{

 inta[10] = {0,1,2,3,4,5,6,7,8,9};

 inttemp=0;

 int*p=a;

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=*p++;

 printf("*p++的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=*(p++);

 printf("*(p++)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp= (*p)++;

 printf("(*p)++的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=*++p;

 printf("*++p的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=*(++p);

 printf("*(++p)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=++*p;

 printf("++*p的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 printf("p的初始值为%p, *p值为%d\n", p, *p);

 temp=++(*p);

 printf("++(*p)的值为%d, 运算后p的值为%p, *p的值为%d\n\n", temp, p, *p);

 return0;

}

网络异常,图片无法展示
|

指针和数组

可以用数组的名字作为指向数组第一个元素的指针。但数组名是指针常量,不能赋值。

函数中数组形式的形式参数传入的都是指针,为了明确指针形式,可以将数组型形式参数该为指针,两者是完全一样的。

同样,指针也可以作为数组名一样使用,指针p的表达式p[i]等价于*(p+i)

多维数组的元素在内存中是依序存储的,获得第一个元素的指针,就可以通过重复自增指针的方式访问到每一个元素。

C语言中n维数组是被当成一个一维数组,每个数组元素是一个n-1维数组,依次类推。因此对于数组int a[N1][N2]...[Nm]来说,a是一个一维数组的指针,其元素是一个n维数组,因此a指针增减的移动单位是n维数组,a[N1]是一个一维数组的指针,其元素是一个n-1维数组,因此a[N1]指针增减的移动单位是n-1维数组,依次类推,a[N1][N2]...[Nm-1]是一个一维数组的指针,其指针增加的移动单位是一个int型长度,指针指向的是int型的数组元素。

/**************************************

* pointer7.c                         *

*                                    *

* C语言中指针和数组                  *

**************************************/

#include <stdio.h>

#define N 10

voidReversePrint(inta[])

{

 int*p=a+N-1;

 for (; p>=a; p--)

   printf("%d ", *p);

}

intSum(int*a)

{

 int*p=a;

 intsum=0;

 for(; p<a+N; p++)

   sum+=*p;

 returnsum;

}

intmain()

{

 inta[N];

 printf("请输入%d个整数", N);

 inti=0;

 for (; i<N; i++)

   scanf("%d", &a[i]);

 printf("10个数的反序排列为:");

 ReversePrint(a);

 printf("\n");

 printf("这%d个整数的和为%d\n", N, Sum(a));

 return0;

}

网络异常,图片无法展示
|

参考文献

  1. K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社
  2. https://www.coursera.org/course/pkuic
目录
相关文章
|
3月前
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
|
3月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
4月前
|
存储 C语言 数据格式
【C语言基础考研向】03混合运算和printf讲解
本文分为两部分。第一部分介绍了C语言中的混合运算与类型强制转换的重要性,通过实例展示了当整型数进行除法运算且结果为小数时,必须使用类型转换才能正确存储浮点数结果。第二部分详细讲解了`printf`函数的功能与使用方法,包括格式化输出不同类型数据的基本语法,并通过具体示例演示了如何利用字段宽度和对齐方式来控制输出格式,帮助读者更好地理解和掌握输出格式的控制技巧。
66 10
|
7月前
|
C语言
C 语言的运算及流程控制分享
C 语言的运算及流程控制
|
7月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)一
58 1
|
7月前
|
C语言
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
C语言学习记录——操作符习题、算数转换习题,多解法&优解法&单选题
34 1
|
7月前
|
存储 C语言
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
C语言学习记录——7000+字长文-复习&学习指针(指针、地址、指针变量、指针与数组、指针与函数、指针数组、多级指针)二
48 1
|
7月前
|
C语言
C语言中的赋值运算、比较运算和逻辑运算详解
C语言中的赋值运算、比较运算和逻辑运算详解
137 0
|
8月前
|
存储 Linux C语言
C语言初阶⑥(操作符详解)编程作业(算数转换)(下)
C语言初阶⑥(操作符详解)编程作业(算数转换)
41 1
|
7月前
|
C语言
C语言算数运算符和算数表达式详解
C语言算数运算符和算数表达式详解
125 0