【问题标题】:C pass int array pointer as parameter into a functionC将int数组指针作为参数传递给函数
【发布时间】:2012-11-23 17:23:36
【问题描述】:

我想将 B int 数组指针传递给 func 函数,并能够从那里更改它,然后查看 main 函数中的更改

#include <stdio.h>

int func(int *B[10]){

}

int main(void){

    int *B[10];

    func(&B);

    return 0;
}

上面的代码给了我一些错误:

In function 'main':|
warning: passing argument 1 of 'func' from incompatible pointer type [enabled by default]|
note: expected 'int **' but argument is of type 'int * (*)[10]'|

编辑: 新代码:

#include <stdio.h>

int func(int *B){
    *B[0] = 5;
}

int main(void){

    int B[10] = {NULL};
    printf("b[0] = %d\n\n", B[0]);
    func(B);
    printf("b[0] = %d\n\n", B[0]);

    return 0;
}

现在我收到这些错误:

||In function 'func':|
|4|error: invalid type argument of unary '*' (have 'int')|
||In function 'main':|
|9|warning: initialization makes integer from pointer without a cast [enabled by default]|
|9|warning: (near initialization for 'B[0]') [enabled by default]|
||=== Build finished: 1 errors, 2 warnings ===|

【问题讨论】:

  • 好吧,错误信息解释了它。您传递一个指向 10 个数组的指针 int *,但 func 需要一个 int**(它应该是一个指向(10,大概)int*s 数组的第一个元素的指针)。如何修复它取决于 func 的作用。
  • func 将简单地编辑 B 值,如 B[0]、B[1] 等。
  • 那么您可能只想传递B。由于B 实际上是一个数组,因此传递&amp;B 通常没有用处,因为B 无法更改(但它的内容可以更改,这就是您想要做的)。
  • 当我尝试在 func 函数中编辑 B 的值时,使用新代码更新问题并出现错误
  • 你原来的问题的答案是func应该这样声明:int func(int (*B)[10])

标签: c arrays function pointers parameters


【解决方案1】:

使用*(B) 而不是*B[0]。 这里,*(B+i) 隐含B[i]*(B) 隐含B[0],即
*(B+0)=*(B)=B[0]

#include <stdio.h>

int func(int *B){
    *B = 5;     
    // if you want to modify ith index element in the array just do *(B+i)=<value>
}

int main(void){

    int B[10] = {};
    printf("b[0] = %d\n\n", B[0]);
    func(B);
    printf("b[0] = %d\n\n", B[0]);
    return 0;
}

【讨论】:

    【解决方案2】:

    func 的参数是接受双指针变量。 希望这会有所帮助...

    #include <stdio.h>
    
    int func(int **B){
    
    }
    
    int main(void){
    
        int *B[10];
    
        func(B);
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      使用 Greggo 的非常出色的示例,我将其作为冒泡排序工作,将数组作为指针传递并进行简单的 -1 操作。

      #include<stdio.h>
      
      void sub_one(int (*arr)[7])
      {
           int i; 
           for(i=0;i<7;i++)
          {
              (*arr)[i] -= 1 ; // subtract 1 from each point
              printf("%i\n", (*arr)[i]);
      
          }
      
      }   
      
      int main()
      {
          int a[]= { 180, 185, 190, 175, 200, 180, 181};
          int pos, j, i;
          int n=7;
          int temp;
          for (pos =0; pos < 7; pos ++){
              printf("\nPosition=%i Value=%i", pos, a[pos]);
          }
          for(i=1;i<=n-1;i++){
              temp=a[i];
              j=i-1;
              while((temp<a[j])&&(j>=0)) // while selected # less than a[j] and not j isn't 0
              {
                  a[j+1]=a[j];    //moves element forward
                  j=j-1;
              }
               a[j+1]=temp;    //insert element in proper place
          }
      
          printf("\nSorted list is as follows:\n");
          for(i=0;i<n;i++)
          {
              printf("%d\n",a[i]);
          }
          printf("\nmedian = %d\n", a[3]);
          sub_one(&a);
      
          return 0;
      }
      

      我需要了解如何封装指针,因为这让我很反感。

      【讨论】:

        【解决方案4】:

        如果你真的想传递一个数组指针,那就是

        #include <stdio.h>
        
        void func(int (*B)[10]){   // ptr to array of 10 ints.
                (*B)[0] = 5;   // note, *B[0] means *(B[0])
                 //B[0][0] = 5;  // same, but could be misleading here; see below.
        }
        
        int main(void){
        
                int B[10] = {0};   // not NULL, which is for pointers.
                printf("b[0] = %d\n\n", B[0]);
                func(&B);            // &B is ptr to arry of 10 ints.
                printf("b[0] = %d\n\n", B[0]);
        
                return 0;
        }
        

        但正如其他答案所述,这样做并不常见。通常只有当你想传递一个二维数组时才会传递一个指向数组的指针,它突然看起来更清晰了,如下所示。二维数组实际上是作为指向其第一行的指针传递的。

        void func( int B[5][10] )  // this func is actually the same as the one above! 
        {
                 B[0][0] = 5;
        }
        
        int main(void){
            int Ar2D[5][10];
            func(Ar2D);   // same as func( &Ar2D[0] )
        }
        

        func的参数可以声明为int B[5][10]int B[][10]int (*B)[10],都等价于参数类型。

        附录:你可以从一个函数返回一个指向数组的指针,但是声明函数的语法很笨拙,类型的[10]部分必须在参数列表之后:

        int MyArr[5][10];
        int MyRow[10];
        
        int (*select_myarr_row( int i ))[10] { // yes, really
           return (i>=0 && i<5)? &MyArr[i] : &MyRow;
        }
        

        这通常如下进行,以避免眼睛疲劳:

        typedef int (*pa10int)[10];
        
        pa10int select_myarr_row( int i ) {
           return (i>=0 && i<5)? &MyArr[i] : &MyRow;
        }
        

        【讨论】:

        • 我注意到 C++ 正在获得可模板化的 typedef,因此应该可以编写 ptr_to_arr_of select_myarr_row ... .
        【解决方案5】:

        也许你正试图这样做?

        #include <stdio.h>
        
        int func(int * B){
        
            /* B + OFFSET = 5 () You are pointing to the same region as B[OFFSET] */
            *(B + 2) = 5;
        }
        
        int main(void) {
        
            int B[10];
        
            func(B);
        
            /* Let's say you edited only 2 and you want to show it. */
            printf("b[0] = %d\n\n", B[2]);
        
            return 0;
        }
        

        【讨论】:

        • 如果我尝试在 func 中编辑 B[2] 我会遇到一些错误... 代码:*B[2] = 5;
        • @fxuser:“我遇到了一些错误”不是有用的问题描述。寻求帮助,就好像你是被问到的人一样。您收到错误是因为 B 是指向 int 的指针,而 B[2] 返回一个 int,而不是指针。所以,你只需要B[2] = 5;
        • 这是我一直在寻找的答案。你为什么要array + 2 而不是array[2]
        【解决方案6】:

        在函数声明中你必须输入 as

        VOID FUN(INT *a[]);
        /*HERE YOU CAN TAKE ANY FUNCTION RETURN TYPE HERE I CAN TAKE VOID AS THE FUNCTION RETURN  TYPE FOR THE FUNCTION FUN*/
        //IN THE FUNCTION HEADER WE CAN WRITE AS FOLLOWS
        void fun(int *a[])
        //in the function body we can use as
        a[i]=var
        

        【讨论】:

          【解决方案7】:
          main()
          {
              int *arr[5];
              int i=31, j=5, k=19, l=71, m;
          
              arr[0]=&i;
              arr[1]=&j;
              arr[2]=&k;
              arr[3]=&l;
              arr[4]=&m;
          
              for(m=0; m<=4; m++)
              {
                  printf("%d",*(arr[m]));
              }
              return 0;
          }
          

          【讨论】:

            【解决方案8】:

            在新的代码赋值应该是,

            B[0] = 5
            

            在 func(B) 中,您只是传递指向数组 B 的指针的地址。您可以在 func() 中将其更改为 B[i] 或 *(B + i)。其中 i 是数组的索引。

            在声明的第一段代码中,

            int *B[10]
            

            说 B 是一个由 10 个元素组成的数组,每个元素都是一个指向 int 的指针。也就是说,B[i] 是一个 int 指针,*B[i] 是它指向第 i 个已保存文本行的第一个整数的整数。

            【讨论】:

              【解决方案9】:

              在您的新代码中,

              int func(int *B){
                  *B[0] = 5;
              }
              

              B 是指向int 的指针,因此B[0]int,您不能取消引用int。只需删除*

              int func(int *B){
                  B[0] = 5;
              }
              

              它有效。

              在初始化中

              int B[10] = {NULL};
              

              您正在使用void* (NULL) 初始化int。由于有一个从void*int 的有效转换,它可以工作,但它并不完全符合规定,因为转换是由实现定义的,并且通常表明程序员有错误,因此编译器会发出警告。

              int B[10] = {0};
              

              是 0 初始化 int[10] 的正确方法。

              【讨论】:

                猜你喜欢
                • 2013-01-25
                • 1970-01-01
                • 1970-01-01
                • 2012-01-24
                • 2015-03-17
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多