C语言 如何仅使用地址和指针(无索引)将数组右移(已关闭)

hl0ma9xz  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(139)

我有一个任务是将一个真实的数组向右移动n个元素,我已经成功地完成了这个任务,但是我注意到我应该只使用地址和指针。我试着用地址重写代码,但是似乎不起作用,有人能帮我吗?
所以这里的代码是工作,但它使用的索引方法,希望你能帮助我,因为我是哑巴,不能重写它正确(

#include <stdio.h>
#include <math.h>
#define N 5

void main() {

  
  double ar[N] = {1.2, 2.2, 3.3, 4.4, 5.5};
  int n; 
  int save;
  printf_s("Enter an n:");
  scanf_s("%d", &n);
  int length = sizeof(ar) / sizeof(ar[0]);

  

  while (n) {

    save = ar[N - 1];

    for (int i = N - 1; i > 0; i--)
    ar[i] = ar[i - 1];

    ar[0] = save;
    n--;
  }
  for (int i = 0; i < length; i++) {
    printf("%f; ", ar[i]);

  }
}
vbopmzt1

vbopmzt11#

你应该会发现很多关于数组指针递增的引用。下面是一个供你参考的Pointer Arithmetic
以它为参考,下面是一个经过调整的程序版本,用一个递增和递减的指针替换数组索引。

#include <stdio.h>
#include <math.h>
#define N 5

int main()
{

    double ar[N] = {1.2, 2.2, 3.3, 4.4, 5.5};
    double * loc = ar;                          /* Pointer to reference elements in the array */
    int n;
    float save;
    printf("Enter an n: ");
    scanf("%d", &n);
    int length = sizeof(ar) / sizeof(ar[0]);

    while (n)
    {
        save =  *(loc + N - 1);                 /* Store the value currently stored in the last array element */

        for (int i = N - 1; i > 0; i--)
        {
            *(loc + i) = *(loc + i - 1);
        }

        *loc = save;
        n--;
    }
    for (int i = 0; i < length; i++)
    {
        printf("%f; ", ar[i]);
    }

    printf("\n");

    return 0;
}

对此进行测试,结果为以下终端输出。

@Dev:~/C_Programs/Console/Shift/bin/Release$ ./Shift 
Enter an n: 2
4.400000; 5.500000; 1.200000; 2.200000; 3.300000; 
@Dev:~/C_Programs/Console/Shift/bin/Release$ ./Shift 
Enter an n: 3
3.300000; 4.400000; 5.500000; 1.200000; 2.200000;

给予一下,看看它是否符合你的项目的精神。

rkttyhzu

rkttyhzu2#

将ar[x]与 *(ar +(x))交换,结果成功了。

#include <stdio.h>
#include <math.h>
#define N 5
void main() {

    double ar[N] = { 1.2, 2.2, 3.3, 4.4, 5.5 };
    int n; //кількість позицій
    double save;
    printf_s("Enter n");
    scanf_s("%d", &n);
    int length = sizeof(ar) / sizeof(ar[0]);


    while (n) {

        save = *(ar + N - 1); 

        for (int i = N - 1; i > 0; i--) 
            *(ar + i) = *(ar + i - 1);

        *(ar + 0) = save; 
        n--; 
    }
    for (int i = 0; i < length; i++) {
        printf("%f; ", ar[i]);

    }
        }
pvcm50d1

pvcm50d13#

下面是基于您的代码的实现,

#include<stdio.h>

void pointer_shift(int *a, int n) 
{
   int temp;
   temp = a[n -1];                     /* store the last element in the temp variable  */
   for(int i =n -1; i>0; i--)
    {
        *(a+i) = *(a+i-1);
    }
    *a = temp;
}

void displayArr(int *a, int size)
{
    printf("\nDisplay array element: ");
    for(int i = 0; i<size; i++)
    {
        printf("%d ", a[i]);
    }
}

int main()
{
    int a1[] = {100, 101, 102};
    size_t size = sizeof(a1)/sizeof(a1[0]);
    displayArr (a1, size);
    pointer_shift(a1, 3);
    displayArr (a1, size);

    return 0;

}

输出:

Display array element: 100 101 102 
Display array element: 102 100 101

相关问题