【问题标题】:Pointers with arrays in CC中带有数组的指针
【发布时间】:2018-06-16 12:35:54
【问题描述】:

代码 1:

#include<stdio.h>
int main(void)
{
    int* arr[5];
    for(int i=0; i<5; i++) {
        arr[i] = (int*)malloc(sizeof(int));
        *arr[i] = i;
    }
    printf("%d",arr[3]);
    return 0;
}

输出:

13509232

代码 2:

#include<stdio.h>
int main(void)
{
    int* arr[5];
    for(int i=0; i<5; i++) {
        arr[i] = (int*)malloc(sizeof(int));
        *arr[i] = i;
    }
    printf("%d",arr[3][0]);
    return 0;
}

输出:

3

我已经声明了一个指针数组。我可以简单地编写 arr[3][0] 来取消引用它,而不是使用 *arr[3] 来取消引用存储的值。它适用于数组的所有维度。只需在其维度上添加一个额外的零,即可取消引用存储在该位置的值。

我无法理解,因为首先,arr[3] 是一维数组,而 arr[3][0] 是二维数组。毕竟,arr[3] 是一个地址,而 arr[3][0] 是存储在地址 arr[3] 的值。我可以用这种方式摆脱 * 运算符吗?请用通俗的话解释一下。

提前致谢。

编辑 1:让我们采用最简单的情况,单变量。

#include<stdio.h>
int main(void)
{
    int k=5;
    int *ptr=&k;
    printf("%d",ptr[0]);
    return 0;
}

输出:

5

【问题讨论】:

  • 不要转换malloc的返回值。如果您忘记包含 stdlib.h(顺便说一句,您确实这样做了),它会隐藏错误。
  • 关于:printf("%d",arr[3]); 代码试图打印的值是一个地址。不是整数。所以正确的格式说明符是 '%p' 而不是 '%d'
  • 在调用任何堆分配函数时:malloccallocrealloc,始终检查(!= NULL)返回值以确保操作成功
  • 如果代码试图打印指向数组条目的值,正确的语法应该是:printf( "%d\n", *(arr[3]) ); 这考虑了您要访问的值并考虑了C 运算符

标签: c arrays pointers


【解决方案1】:

ptr[x] 可以写成*(ptr+x)。因此,ptr[0] 转换为 *(ptr+0),即*ptr

【讨论】:

    【解决方案2】:

    %d 期望值本身,而不是指向它的指针。 arr[3] 是一个指针,是指针数组中的第四个指针。 arr[3][0] 是实际数字。你也可以写*arr[3],而且你实际上是在循环中写的。

    指针的行为类似于数组,在将内存分配给int *a 后,您可以将值存储到指向的位置为*a=123a[0]=123。此外,如果您为 2 个整数分配内存,则可以使用 a[1](更简单)访问第二项,也可以使用 *(a+1)

    底线:就int-s 而言,您有一个二维数组,只是不是紧密排列的n*m 样式的数组,而是通常称为锯齿状(https://en.wikipedia.org/wiki/Jagged_array) 的数组。

    【讨论】:

      【解决方案3】:

      由于两种情况计算的地址相同,因此可以使用它们 arr[3][0]。 假设 arr[3] 的地址为 1000。 arr[3][0] 的子地址将为 1000+0*sizeof(int) 即 1000

      【讨论】:

        【解决方案4】:

        使用[0] 来表示尊重有一个简单的解释(尽管我不会推荐它)。看这个小代码:

        int i;
        int j[1];
        

        这两个有什么区别?显然一个是大小为 1 的数组,但如果你仔细想想,大小为 1 的数组在某种程度上等于定义一次该类型。

        使用* 取消引用在某种程度上等同于使用数组索引访问。但是因为数据看起来像是一个包含 1 个元素的数组,所以您可以使用 [0] 访问它。

        【讨论】:

          【解决方案5】:

          使用这种类型的代码。并尝试将您的代码更改为这种方式, 希望这可以帮助你。 干杯。

          #include<stdio.h>
          #include<stdlib.h>
          
          int main()
          {
              float *p, tot = 0;
              int i, n;
          
              printf("Number of observations: ");
              scanf("%d", &n);
          
              p = (float*)malloc(n*sizeof(float));
          
              if(p==NULL)
              {
                  printf("Memory is not allocated");
                  exit(1); 
              }
          
              for(i = 0; i < n; i++)
              {
                  scanf("%f", p+i);
              }
          
          
              for(i = 0; i < n; i++)
              {
                  tot += *(p+i);
              }
          
              printf("\nAverage = %.2f\n", tot/n);
          
          
              return 0;
          }
          

          示例输入:

          观察次数:4

          12.12

          34.14

          43.1

          45.87

          样本输出:

          平均 = 33.81

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多