C 语言中的指针算法

原文:https://www.studytonight.com/c/pointer-arithmetic-in-c.php

要想对指针有完整的了解,指针算术非常重要要懂。在本主题中,我们将研究当指针递增时,内存地址如何变化。


16 位机(涡轮增压)

在 16 位机器中,所有类型指针的大小,无论是int*float*char*还是double*总是 2 字节。但是当我们在指针上执行任何算术函数如增量时,变化会根据其原始数据类型的大小而发生。

16 位机器上数据类型的大小:

| 类型 | 大小(字节) | | 整数或有符号整数 | Two | | 茶 | one | | 长的 | four | | 漂浮物 | four | | 两倍 | eight | | 长双 | Ten |


指针算法示例

现在让我们举几个例子,更清楚地理解这一点。

int* i;
i++;

在上述情况下,指针将为 2 字节。而当我们递增时,它会递增 2 个字节,因为int也是 2 个字节。

float* i;
i++;

在这种情况下,指针的大小最初仍然是 2 字节。但是现在,当我们增加它时,它将增加 4 个字节,因为float 数据类型是 4 个字节。

double* i;
i++;

同样,在这种情况下,指针的大小仍然是 2 字节。但是现在,当我们增加它的时候,它会增加 8 个字节,因为它的数据类型是double


32 位机 (Visual Basic C++)

指针算法的概念保持不变,但是在 32 位机器中指针和各种数据类型的大小是不同的。32 位机器中的指针为 4 字节

下面是 32 位机器上数据类型的大小表:

| 类型 | 大小(字节) | | 整数或有符号整数 | four | | 茶 | Two | | 长的 | eight | | 漂浮物 | eight | | 两倍 | Sixteen |

注意:我们不能添加两个指针。这是因为指针包含地址,添加两个地址没有意义,因为你不知道它会指向什么。

但是我们可以减去两个指针。这是因为两个指针之间的差异给出了可以存储在两个指针之间的数据类型的元质数量。


指针算法程序(32 位机器)

#include <stdio.h>

int main()
{
    int m = 5, n = 10, o = 0;

    int *p1;
    int *p2;
    int *p3;

    p1 = &m;    //printing the address of m
    p2 = &n;    //printing the address of n

    printf("p1 = %d\n", p1);
    printf("p2 = %d\n", p2);

    o = *p1+*p2;
    printf("*p1+*p2 = %d\n", o);//point 1

    p3 = p1-p2;
    printf("p1 - p2 = %d\n", p3); //point 2

    p1++;
    printf("p1++ = %d\n", p1); //point 3

    p2--;
    printf("p2-- = %d\n", p2); //point 4

    //Below line will give ERROR
    printf("p1+p2 = %d\n", p1+p2); //point 5

    return 0;
}

P1 = 2680016 p2 = 2680012 P1+ p2 = 15 P1-p2 = 1 p1++ = 2680020 p2-= 2680008

上述程序的说明:

  1. 第 1 点:这里,*表示“给定地址的值”。因此,它将 m 和 n 的值相加,即 15。
  2. 点 2: 它减去两个变量的地址,然后除以指针数据类型的大小(这里是整数,大小为 4 字节),这就给出了可以存储在其中的整数数据类型的元质数量。
  3. 点 3: 它将指针存储的地址增加其数据类型的大小(这里是 4)。
  4. 指针 4: 它将指针存储的地址减其数据类型的大小(这里是 4)。
  5. 点 5: 不允许增加两个指针。