我们可以在 C++ 中向数组添加一个整数吗?

Can we add an integer to an array in c++

#include <bits/stdc++.h> 
using namespace std; 

/*Prototype for utility functions */
void printArray(int arr[], int size); 
void swap(int arr[], int fi, int si, int d); 

void leftRotate(int arr[], int d, int n) 
{ 
    /* Return If number of elements to be rotated 
    is zero or equal to array size */
    if(d == 0 || d == n) 
        return; 
        
    /*If number of elements to be rotated 
    is exactly half of array size */
    if(n - d == d) 
    { 
        swap(arr, 0, n - d, d); 
        return; 
    } 
        
    /* If A is shorter*/        
    if(d < n - d) 
    { 
        swap(arr, 0, n - d, d); 
        leftRotate(arr, d, n - d);   
    } 
    else /* If B is shorter*/       
    { 
        swap(arr, 0, d, n - d); 
        leftRotate(arr + n - d, 2 * d - n, d); /*This is tricky*/
    } 
} 

/*UTILITY FUNCTIONS*/
/* function to print an array */
void printArray(int arr[], int size) 
{ 
    int i; 
    for(i = 0; i < size; i++) 
        cout << arr[i] << " "; 
    cout << endl; 
} 

/*This function swaps d elements starting at index fi 
with d elements starting at index si */
void swap(int arr[], int fi, int si, int d) 
{ 
    int i, temp; 
    for(i = 0; i < d; i++) 
    { 
        temp = arr[fi + i]; 
        arr[fi + i] = arr[si + i]; 
        arr[si + i] = temp; 
    } 
} 

// Driver Code 
int main() 
{ 
    int arr[] = {1, 2, 3, 4, 5, 6, 7}; 
    leftRotate(arr, 2, 7); 
    printArray(arr, 7); 
    return 0; 
} 

// This code is contributed by Rath Bhupendra 

我在 geek for geeks 网站上找到了这段代码。该代码用于旋转数组的元素。网站上提到它是块交换算法,我的问题是:

我们能否在传递参数 (arr+n-d) 的同时向左旋转函数的 else 部分中给出的 C++ 中的数组添加整数?

我们如何向数组添加整数?

我尝试在在线编译器中向数组添加一个整数,但没有成功。但是上面的代码完美地给出了所需的输出 34567.

网站的 link 是 https://www.geeksforgeeks.org/block-swap-algorithm-for-array-rotation/

Can we add integers to an array in c++ as given in the else part of the left rotate function while passing the arguments (arr+n-d)?

How can we add integers to an array?

答案是你不能,这不是这里发生的事情。

int arr[] 参数衰减为指向数组第一个元素的指针。它与 int* arr 相同,所以您在 arr + n - d 中所做的是简单的指针运算。

指针将相对于计算表达式之前所在的位置移动 n - d 个位置。

假设 n - d 的结果是 4,并且 arr 指向作为参数传递的数组的开头,即指向 &arr[0](以数组表示法)或arr + 0(用指针表示法),这是它在初始状态下指向的位置,您将有 arr + 4&arr[4],在求值之后,表达式提供对地址的访问索引 4(数组的第 5 个元素)。要访问该地址中的值,您将使用 *(arr + 4)arr[4].

附带说明一下,我不建议使用 geeksforgeeks.com 来学习 C++ 或任何其他语言,就此而言,这应该通过阅读 good book 来完成。

具有数组类型的函数参数被编译器调整为指向数组元素类型的指针。即这两个函数声明是等价的,声明同一个函数。

void leftRotate(int arr[], int d, int n);

void leftRotate(int *arr, int d, int n);

你甚至可以这样写

void leftRotate(int arr[100], int d, int n);
void leftRotate(int arr[10], int d, int n);
void leftRotate(int arr[1], int d, int n);

这些声明再次声明函数

void leftRotate(int *arr, int d, int n);

所以在函数中这个表达式

arr + n - d

使用应用于指针的指针算法 arr

例如,表达式 arr + 0 等同于 arr 并指向数组的第一个元素。表达式 arr + n 指向数组的 n-th 元素。

这是一个演示程序,其中使用指针算法在循环中输出数组元素。

#include <iostream>

int main() 
{
    int a[] = { 1, 2, 3, 4, 5 };
    
    for ( size_t i = 0; i < sizeof( a ) / sizeof( *a ); i++ )
    {
        std::cout << *( a + i ) << ' ';
    }
    std::cout << '\n';
    
    return 0;
}

程序输出为

1 2 3 4 5

在表达式 *( a + i ) 中,数组指示符 a 被隐式转换为指向其第一个元素的指针。

这是另一个演示程序,它显示具有数组类型的函数参数被编译器调整为指向数组元素类型的指针。

#include <iostream>
#include <iomanip>
#include <type_traits>

const size_t N = 100;

void f( int a[N] )
{
    std::cout << "\nin function\n";
    std::cout << "sizeof( a ) = " << sizeof( a ) << '\n';
    std::cout << "a is a pointer " << std::boolalpha <<std:: is_same<decltype( a ), int *>::value << '\n';
}

int main() 
{
    int a[N];
    
    std::cout << "In main\n";
    std::cout << "sizeof( a ) = " << sizeof( a ) << '\n';
    std::cout << "a is an array " << std::boolalpha <<std:: is_same<decltype( a ), int [N]>::value << '\n';

    f( a );
    
    return 0;
}

程序输出为

In main
sizeof( a ) = 400
a is an array true

in function
sizeof( a ) = 8
a is a pointer true