【问题标题】:Array pointer in C programC程序中的数组指针
【发布时间】:2016-03-20 08:09:34
【问题描述】:

这是教科书中的一个C程序,它向用户询问一个3*5的二维数组并打印第三行。

我对@9​​87654321@ 感到困惑。为什么这里需要[5],我觉得只要int* p就可以了。它可以重复添加并指向int数组中的下一个内存空间。谁能解释一下指针在这个程序中是如何工作的?

#include <stdio.h>

int main(void){
        int a[3][5];
        int i,j;
        int *p[5];

        p = &a[0];
        printf("Please input:\n");
        for(i = 0; i < 3; i++){
                for(j = 0; j<5;j++){
                        scanf("%d\n",(*(p+i))+j);
                }
        }
        p = &a[2];
        printf("the third line is:\n");
        for(j = 0; j<5; j++){
                printf("%5d", *((*p)+j));
        }
        printf("\n");
}

【问题讨论】:

  • 在 C 中,二维数组只是一个数组的数组。
  • 你是对的。这里不需要p[5]。显然,没有分配给任何p[i]
  • p = &amp;a[0]; 不应编译。
  • 虽然它可能有效,但它仍然是错误且无用的。为什么不直接索引到二维数组?无论如何,int *p[5] 是错误的类型。只是另一位在数组和指针以及 C 中的语法方面遇到问题的作者。指向内部数组的指针是 int (*p)[5] - 注意括号!
  • 但是当我将其更改为 int*p 时,它报告 (*(p+i))+j) 变为输入 int 而不是 int *。我只想知道这里发生了什么?

标签: c arrays pointers variable-declaration pointer-to-array


【解决方案1】:
int *p[5];

是一个由五个指向int 的指针组成的数组。

你想要的是一个指向五个ints 的数组的指针

int (*p)[5];

因为&amp;a[0]a 的第一个元素的地址,它是int[5]

编译器应该至少对此发出明确的警告,如果不是错误的话,这是意料之中的。

更多信息在这里:C pointer to array/array of pointers disambiguation

【讨论】:

  • 是的,它报告了一个警告。应该有括号。但最让我困惑的是,当我将其更改为 int*p 时,(*(p+i))+j) 变成了 int 而不是 int *。为什么会这样?
  • @JenniferQ 将* 应用到int *int
  • @JenniferQ: int * pp 定义为指向int。如果您将取消引用运算符* 应用于p,您将得到指向的内容,即此处的int
猜你喜欢
  • 1970-01-01
  • 2018-12-13
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2021-05-17
相关资源
最近更新 更多