C语言 第五章 指针(3)

目录

指针常用运算

 定义:

指针与整数值的加减运算

格式:

举例:

说明:

实例 

举例:

实例

指针的自增、自减运算 

定义

 实例1:

实例2:


 

指针常用运算


 定义:

          指针本质上就是一个无符号整数代表了内存地址

          除了上面提到的取址、取值外,指针还可以与整数加减、自增自减、同类指针相减运算等。            但是规则并不是整数运算的规则。


指针与整数值的加减运算


格式:

        指针±整数
 
注:

  1. 指针与整数值的加减运算,表示指针所指向的内存地址的移动(加,向后移动;减,向前移动)。
  2. 指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。通过此操作,可以快速定位你要的地址。

举例:

int mainm(){
short m = 10;
short* s = &m;
printf("%p\n", s);//变量m的正常地址
printf("%p\n", s + 1);//变量m位置+1,位置添加2个字节
printf("%p\n", s - 1);//变量m位置-1,位置减少2个字节

int n = 20;
int *i = &n;
printf("%p\n", i);
printf("%p\n", i + 1);
printf("%p\n", i - 1);
return 0 ;
 }

说明:

  • s + 1表示指针向内存地址的移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于移动两个字节。

变量a、b、c、d、e都是整型数据int类型,它们在内存中占据一块连续的存储区域。指针变量p指向变量a,也就是p的值是0xFF12,则:

 
说明:

指针p+1并不是地址+1,而是指针p指向下一个数据。比如,int* p,p+1表示当前地址+4,指向下一个整型数据。

实例 

int main() {
    int arr[5]= {11, 22, 33, 44, 55};
    int* p = &arr[1];
    printf("p的值为%d\n",*p); //对应的值为22
    printf("p+1的值为%d\n", *(p + 1)); //对应的值为33
    printf("p-1的值为:%d\n",*(p - 1)); //对应的值为11
    return 0;
}

注意:只有指向连续的同类型数据区域,指针加、减整数才有实际意义。


举例:

对于长度是N的一维数组a,当使用指针p指向其首元素后,即可通过指针p访问数组的各个元素。

 
其中:

  • a[0]用*p表示
  • a[1]用*(p+1)表示
  •  a[i]用*(p+i)表示

实例

#include "stdio.h"

int main() {

    //指针进行加减运算,与普通整数加减规则不同, +-指的是地址进行移动,每次一定指定个单位(一个单位指一个数据类型所占的字节个数)
    short m = 10;
    short* s = &m;
    printf(" %p\n",s);//变量m的正常地址 0000009461ff706
    printf(" %p\n", s + 1);//变量m位置+1,位置添加2个字节 0000009461ff708  +1指的是地址向后移动一个单位(一个单位指一个数据类型所占的字节个数)
    printf(" %p\n", s - 1);//变量m位置-1,位置减少2个字节 0000009461ff704

    int n = 20;
    int *i = &n;
    printf(" %p\n", i); //000000456edffa08
    printf(" %p\n", i +1);//000000456edffa0c
    printf(" %p\n", i - 1);//000000456edffa04

}

指针的自增、自减运算 


定义

指针类型变量也可以进行自增或自减运算,如下: 
   p++、p--、++p、--p
  
:++和--,这里针对指针的增加或减少指的是内存地址的向前或向后移动。
 
对于数组来说,由于数组在内存中是连续分布的:

  • 当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如int*指针,每++一次,就增加4个字节。
  • 当对指针进行--时,指针会按照它指向的数据类型字节数大小减少,比如int*指针,每--一次,就减少4个字节。

 实例1:

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int* p1 = &arr[0];
    int* p2 = &arr[3];
    printf("p1的值为:%d\n", *p1);     //1
    printf("++p1的值为:%d\n", *++p1); //2
    printf("p1的值为:%d\n", *p1);     //2

    printf("p2的值为:%d\n", *p2);     //4
    printf("--p2的值为:%d\n", *--p2); //3
    printf("p2的值为:%d\n", *p2);     //3

    return 0;
}
 

实例2:

请分析下面几种情况。
初始情况:

int a[5] = {10,20,30,40,50};

情况1

 int* p = a;  //p开始时指向数组a的首元素  等同于 int* p = &a[0];
 p++;  //使p指向下一元素a[1]
 printf("%d\n",*p);  //得到下一个元素a[1]的值,即20

情况2:

int* p = a;  //p开始时指向数组a的首元素
printf("%d\n",*p++); //10
printf("%d\n",*p);   //20

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点纭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值