【问题标题】:How to dereference multidimensional Array in C programming?如何在 C 编程中取消引用多维数组?
【发布时间】:2015-01-27 22:51:00
【问题描述】:

我想传递一个指向多维数组的指针,因此该值可以保持不被复制。我该怎么做?我也一直在跟踪 int 计数,它每次都有效吗?我需要的数组是内存。该结构体之前已在 main 之外声明过。

struct registers
{
   int data;     
} registerX, registerY;

void first(int *counter, struct registers* X1, int **m)
{
  int value;
  printf("Enter the value for the X\n");
  scanf("%d", &value);
  X1->data = value;
  m[*counter][1] = X1->data;
  *counter = *counter++;

}
int main()
{
 int memory[SIZE][2];
 int count = 0;
 int choice;
 printf("Enter the instruction number:\n");

 while(choice != 107)
{
  scanf("%d", &choice);
  if(choice == 101)
  {
        memory[count][0] = 101;
        first(&count, &registerX, &memory[count][1]);
  } 

【问题讨论】:

  • &memory[count][1]int *。接收int *m, 然后m[*counter][1] = X1->data; --> *m = X1->data;, *counter = *counter++; --> ++*counter;*counter += 1;
  • *counter++和++*counter有什么区别?
  • *counter++ 表示*(counter++)++ 用于增量指针。 ++*counter 是增量 *counter(*counter)++
  • 谢谢!真的很有帮助!
  • @BLUEPIXY 除了++*counter(*counter)++相同。

标签: c arrays multidimensional-array call dereference


【解决方案1】:
  • 首先,除了Kerrek SB所说的,你可以替换

    *counter = *counter++;
    

    有了这个

    (*counter)++;
    

    编辑:抱歉,我在试图说出 *counter = *counter++ 有什么问题时犯了一个错误,但我得到了 *pointer = *pointer++ 这句话的一些奇怪结果。

  • 其次,我看到您正在使用 registerX 而它只是一个类型,所以您可以先这样做。

    registerX *rgx = NULL;
    rgx = malloc(sizeof(registerX));
    

    并使用。

    first(&count, rgx, memory);
    

考虑到我上面所说的,这段代码对我有用。

#include <stdio.h>
#include <stdlib.h>

#define SIZE 5

typedef struct registers {
    int data;     
} registerX, registerY;

void first(int *counter, struct registers *X1, int m[][2]) {
    int value;

    printf("Enter the value for the X: ");
    scanf("%d", &value);

    X1->data = value;
    m[*counter][1] = X1->data;

    (*counter)++;

    return ;
}

int main() {
    int memory[SIZE][2];
    int count = 0;
    int choice;

    registerX *rgx = NULL;
    rgx = malloc(sizeof(registerX));

    printf("Enter the instruction number: ");

    while(choice != 107) {
        scanf("%d", &choice);

        if (choice == 101) {
            memory[count][0] = 101;
            first(&count, rgx, memory);
            printf("Number %d was stored in memory[%d][%d]\n\n", memory[count-1][1], count-1, 1);
        }

        printf("Enter more instructions: ");
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    函数签名应该是:

    void first(int *counter, struct registers* X1, int m[][2])
    

    或等效:

    void first(int *counter, struct registers* X1, int (*m)[2])
    

    调用应该是:

    first(&count, &registerX, memory);
    

    【讨论】:

    • 第一个,值会被保存吗?因为我需要在 main 的末尾打印它们。
    • @AbylIkhsanov:第一个和第二个声明相同。它们只是拼写完全相同的事物的不同方式。在这两种情况下,函数参数都是指向数组第一个元素的指针(这是一个数组数组,所以第一个元素本身就是一个数组)。
    • @AbylIkhsanov:没问题,很高兴我能帮上忙。
    • 我已经使用您的第一个示例更改了我的代码,现在的问题是数组不存储任何值,它在 :X1->data = value; 的行处一直给出 0; m[*counter][1] = X1->data;, X1->data 存储的是值而不是数组,这很奇怪
    • @AbylIkhsanov:这很奇怪,我倾向于认为您的问题出在其他地方。重新开始,制作一个最小的程序,只练习你的数组逻辑,然后在你了解每个部分的工作原理后构建它。
    猜你喜欢
    • 2018-09-25
    • 2017-05-10
    • 1970-01-01
    • 2018-05-05
    • 2021-08-18
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多