C数组指针算术

时间:2016-06-25 17:07:07

标签: c arrays pointers pointer-arithmetic

我正在尝试重写我的代码,该代码接受用户输入数组,转到该函数并在每个数字之间添加零并将其保存到数组2.我的源代码工作得很好但我无法尝试使其如此它使用指针算法只是为了访问每个数组元素的函数,它不能是子脚本。 您能告诉我有关我的代码或如何执行此操作的建议吗?

源代码:

#include <stdio.h>

void insert0(int n, int a1[], int a2[]);

int main(void) {

  int i;     
  int n;

  printf("Please enter the length of the input array: ");   
    scanf("%d", &n);

  int a[n];   
  int b[2*n];  

  printf("Enter %d numbers for the array: ", n);   
    for (i = 0; i < n; i++){     
      scanf("%d", &a[i]);
    }

  insert0(n, a,  b);

  printf("Output array:");   
    for (i = 0; i < 2*n; i++){
      printf(" %d", b[i]);   
        printf("\n");
    }
    return 0; 
}

void insert0(int n, int a[], int b[]) {

  int i, j = 0; 

  for(i = 0; i < n; i++, j+=2){    
    b[j]= a[i];    
      b[j+1] = 0; 
  }
}

我的算术:

   #include <stdio.h>

    void insert0(int n, int *a1, int *a2);

    int main(void) {

      int i;     
      int n;

      printf("Please enter the length of the input array: ");   
        scanf("%d", &n);

      int a1[n];   
      int a2[2*n];  

      printf("Enter %d numbers for the array: ", n);   
        for (i = 0; i < n; i++){     
          scanf("%d", &a2[i]);
        }

//not sure if this is how you call it, I've seen it called with arr
      insert0(n, a1, a2); 

      printf("Output array:");   
        for (i = 0; i < 2*n; i++){
          printf(" %d", a2[i]);   
            printf("\n");
        }
        return 0; 
    }

    void insert0(int n, int *a1, int *a2) {

      int *p;
      int j = 0;

        // I think I translated this properly     
        for(p = a1; p < a1+n; p++, j+=2){
          a2+j = a1+p;  
          //unsure how to get a2[j+1] to still work here with pointer  
            a2(j+1) = 0; 
      }
    }

3 个答案:

答案 0 :(得分:2)

你需要取消引用你的指针。

a2+j = a1+p;

没有任何效果。这就是说&#34;将地址a2 + j设置为地址a1 + p,&#34;这是你无法做到的。要将存储在a2 + j的值设置为存储在a1 + p的值,您需要这样做:

*(a2+j) = *(a1+p)

您需要将指针算术括在括号内,并在其上使用取消引用运算符。

但是,{p> a1 + p并不是您想要的地址。 p存储的是实际地址,而不仅仅是偏移量,所以您可能只想要p

答案 1 :(得分:1)

问题1:

在您的代码中:

int a1[n];   
int a2[2*n];  

printf("Enter %d numbers for the array: ", n);   

for (i = 0; i < n; i++)
{     
    scanf("%d", &a2[i]); //maybe you are using wrong array to input elements 
}
  • 我认为您需要将元素扫描到a1数组中,因为它的大小为n,并且您正在扫描n元素......
  • 但您正在将元素扫描到a2,并在insert0()函数中进一步使用a2帮助重写a1的元素,这些元素未初始化... < / LI>

<强>溶液

  

将元素扫描到a1

for (i = 0; i < n; i++)
{     
    scanf("%d", &a1[i]); //scanning into `a1`
}

问题2:

  
      
  • 注意:需要注意的另一点是,对于a2[](2*n)-1元素就足够了,因为您只在数字之间分配零,即
  •   

示例:

1,1,1 // 3 elements

1,0,1,0,1 // (2*3)-1=5 elements after inserting

解决方案:

    printf("Please enter the length of the input array: ");
    scanf("%d", &n);

    int a1[n];
    int a2[(2*n)-1];  

最后......

  

但是我无法尝试使它只使用指针算法来访问每个数组元素的函数,它不能是子脚本。

是的,可以使用子脚本编写!

这样:

void insert0(int n, int *a1, int *a2)
{

    int j = 0;

    for(j=0;j<(2*n)-1; j++)
    {
        if(j%2!=0)
            a2[j]=0;
        else
            a2[j]=a1[j/2];
    }
}

所以代码将是:

  #include <stdio.h>

  void insert0(int n, int *a1, int *a2);

  int main(void) 
  {

    int i;
    int n;

    printf("Please enter the length of the input array: ");
    scanf("%d", &n);

    int a1[n];
    int a2[(2*n)-1];

    printf("Enter %d numbers for the array: ", n);
    for (i = 0; i < n; i++)
    {
      scanf("%d", &a1[i]);
    }

    insert0(n, a1, a2);

    printf("Output array:");
    for (i = 0; i < 2*n-1; i++)
    {
        printf(" %d", a2[i]);
        printf("\n");
    }
    return 0;
}

void insert0(int n, int *a1, int *a2)
{

    int j = 0;

    for(j=0;j<(2*n)-1; j++)
    {
        if(j%2!=0)
            a2[j]=0;
        else
            a2[j]=a1[j/2];
    }
}

输入:

3
1 2 3

输出

1
0
2
0
3

答案 2 :(得分:0)

这是一个回复,它不是用于使用指针算法的效率的演示,而是用于显示数组索引(下标)如何转换为指针算法,应用于您的代码。请查看this SO post,其中包含 C 标准中的重要信息。

您的代码也几乎没有逻辑错误,从错误的数组读取和写入等等...您可以自己轻松找到它们。这是一个有效的解决方案:

#include <stdio.h>

void insert0(int n, int *a1, int *a2) {
  int p;    //just a normal int for counter
  int j = 0;

    for(p = 0; p < n; p++, j+=2){
      *(a2+j) = *(a1+p);   //values pointed at are getting assigned
                           //equivalent to a2[j] = a1[p]
      if(p < n - 1 )       //we insert only between numbers
        *(a2 + j + 1) = 0; //pointer pointing at memory into which 0 is copied incremented by 1
    }
 }


int main(void) {
  int i;     
  int n;

  printf("Please enter the length of the input array: ");   
    scanf("%d", &n);

  int a1[n];   
  int a2[2*n];  //one element too long, should be a2[n+n-1];

  printf("Enter %d numbers for the array: ", n);   //reading into smaller array
    for (i = 0; i < n; i++){     
      scanf("%d", &a1[i]);
    }

  insert0 (n, a1, a2); //this is OK

  printf("Output array: ");   
  for (i = 0; i < 2*n - 1; i++){
     printf(" %d", a2[i]);              //printing from the bigger, zero-padded array
  }
  printf("\n");
  return 0; 
}