📜  C中的指针算术与示例

📅  最后修改于: 2021-05-26 00:02:28             🧑  作者: Mango

指针变量也称为地址数据类型,因为它们用于存储另一个变量的地址。该地址是分配给变量的存储位置。它不存储任何值。
因此,仅允许使用C语言对Pointer执行少量操作。这些操作与我们通常用于数学计算的操作略有不同。操作是:

  1. 指针的增减
  2. 将整数加到指针
  3. 整数减指针
  4. 减去两个相同类型的指针

指针的增减

递增:这也是附加条件。当指针增加时,它实际上增加的数量等于它是指针的数据类型的大小。
例如:
如果存储地址1000的整数指针增加,则它将增加2( int的大小),并且新地址将指向1002 。如果将float类型的指针增加,则它将增加4( float的大小),并且新地址将为1004

减量:这是一种条件,也要减去。当指针减少时,它实际上减少的数量等于它是指针的数据类型的大小。
例如:
如果存储地址1000的整数指针递减,则它将递减2( int的大小),并且新地址将指向998 。如果将float类型的指针递减,则它将递减4( float的大小),并且新地址将为996

下面是说明指针增加/减少的程序:

// C program to illustrate
// pointer increment/decrement
  
#include 
  
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
  
    // Pointer to an integer
    int *ptr1, *ptr2;
  
    // Pointer stores
    // the address of N
    ptr1 = &N;
    ptr2 = &N;
  
    printf("Pointer ptr1 "
           "before Increment: ");
    printf("%p \n", ptr1);
  
    // Incrementing pointer ptr1;
    ptr1++;
  
    printf("Pointer ptr1 after"
           " Increment: ");
    printf("%p \n\n", ptr1);
  
    printf("Pointer ptr1 before"
           " Decrement: ");
    printf("%p \n", ptr1);
  
    // Decrementing pointer ptr1;
    ptr1--;
  
    printf("Pointer ptr1 after"
           " Decrement: ");
    printf("%p \n\n", ptr1);
  
    return 0;
}
输出:
Pointer ptr1 before Increment: 0x7ffcb19385e4 
Pointer ptr1 after Increment: 0x7ffcb19385e8 

Pointer ptr1 before Decrement: 0x7ffcb19385e8 
Pointer ptr1 after Decrement: 0x7ffcb19385e4

添加

当给指针添加一个值时,该值首先乘以数据类型的大小,然后再添加到该指针。

// C program to illustrate pointer Addition
#include 
  
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
  
    // Pointer to an integer
    int *ptr1, *ptr2;
  
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
  
    printf("Pointer ptr2 before Addition: ");
    printf("%p \n", ptr2);
  
    // Addition of 3 to ptr2
    ptr2 = ptr2 + 3;
    printf("Pointer ptr2 after Addition: ");
    printf("%p \n", ptr2);
  
    return 0;
}
输出:
Pointer ptr2 before Addition: 0x7fffffdcd984 
Pointer ptr2 after Addition: 0x7fffffdcd990

减法

当用值减去指针时,该值首先乘以数据类型的大小,然后再从指针中减去。

下面是说明指针减法的程序:

// C program to illustrate pointer Subtraction
#include 
  
// Driver Code
int main()
{
    // Integer variable
    int N = 4;
  
    // Pointer to an integer
    int *ptr1, *ptr2;
  
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
  
    printf("Pointer ptr2 before Subtraction: ");
    printf("%p \n", ptr2);
  
    // Subtraction of 3 to ptr2
    ptr2 = ptr2 - 3;
    printf("Pointer ptr2 after Subtraction: ");
    printf("%p \n", ptr2);
  
    return 0;
}
输出:

Pointer ptr2 before Subtraction: 0x7ffcf1221b24 
Pointer ptr2 after Subtraction: 0x7ffcf1221b18

两个指针相减

只有当两个指针具有相同的数据类型时,才可以将它们相减。通过计算两个指针的地址之差并根据指针数据类型计算多少位数据来生成结果。两个指针相减得出两个指针之间的增量。
例如:
两个整数指针说ptr1(address:1000)ptr2(address:1016)相减。地址之间的差为16个字节。由于int的大小为2个字节,因此ptr1和ptr2之间的增量为(16/2)= 8

下面是说明两个指针相减的实现:

// C program to illustrate Subtraction
// of two pointers
#include 
  
// Driver Code
int main()
{
    int x;
  
    // Integer variable
    int N = 4;
  
    // Pointer to an integer
    int *ptr1, *ptr2;
  
    // Pointer stores the address of N
    ptr1 = &N;
    ptr2 = &N;
  
    // Incrementing ptr2 by 3
    ptr2 = ptr2 + 3;
  
    // Subtraction of ptr2 and ptr1
    x = ptr2 - ptr1;
  
    // Print x to get the Increment
    // between ptr1 and ptr2
    printf("Subtraction of ptr1 "
           "& ptr2 is %d\n",
           x);
  
    return 0;
}
输出:
Subtraction of ptr1 & ptr2 is 3

数组上的指针算法:
指针包含地址。添加两个地址是没有意义的,因为不知道它指向的是什么。减去两个地址可让您计算两个地址之间的偏移量。数组名称的行为类似于指针常量。该指针常量的值是第一个元素的地址。例如:如果一个名为arr的数组,则arr和&arr [0]可以用作引用数组的指针。

下面是说明数组上的指针算术的程序:

程序1:

// C program to illustrate the array
// traversal using pointers
#include 
  
// Driver Code
int main()
{
  
    int N = 5;
  
    // An array
    int arr[] = { 1, 2, 3, 4, 5 };
  
    // Declare pointer variable
    int* ptr;
  
    // Point the pointer to first
    // element in array arr[]
    ptr = arr;
  
    // Traverse array using ptr
    for (int i = 0; i < N; i++) {
  
        // Print element at which
        // ptr points
        printf("%d ", ptr[0]);
        ptr++;
    }
}
输出:
1 2 3 4 5

程式2:

// C program to illustrate the array
// traversal using pointers in 2D array
#include 
  
// Function to traverse 2D array
// using pointers
void traverseArr(int* arr,
                 int N, int M)
{
  
    int i, j;
  
    // Travere rows of 2D matrix
    for (i = 0; i < N; i++) {
  
        // Travere columns of 2D matrix
        for (j = 0; j < M; j++) {
  
            // Print the element
            printf("%d ", *((arr + i * M) + j));
        }
        printf("\n");
    }
}
  
// Driver Code
int main()
{
  
    int N = 3, M = 2;
  
    // A 2D array
    int arr[][2] = { { 1, 2 },
                     { 3, 4 },
                     { 5, 6 } };
  
    // Function Call
    traverseArr((int*)arr, N, M);
    return 0;
}
输出:
1 2 
3 4 
5 6

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。