c - 从指针数组中存储/获取值

标签 c arrays pointers

<分区>

我想创建一个数组,我可以在其中添加一些变量地址,然后从地址中获取它们的值,

代码如下:

 SDL_Rect *arraypos[4];

 arraypos[1] = &poskey.x;
 arraypos[2] = &poskey.y;
 arraypos[3] = &posletter.x;
 arraypos[4] = &posletter.y;

posletterposkey struct 类型:SDL_Rect 更多信息:

enter link description here

我做了一个小测试,看看它是否会工作:

printf("%d \n",arraypos[1]);

printf("%d \n",*arraypos[1]); 

printf("%d \n",*arraypos[2]);

printf("%d \n",*arraypos[3]); 

如果我做对了:“指针”旁边的“*”将为您提供变量的值。

但我得到的只是这个警告:

key.c: In function ‘main’:
key.c:49:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
 arraypos[1] = &poskey.x;
             ^
 key.c:50:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
 arraypos[2] = &poskey.y;
             ^
key.c:51:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
 arraypos[3] = &posletter.x;
              ^ 
key.c:52:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
 arraypos[4] = &posletter.y;
             ^
key.c:55:12: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
 printf("%d \n",arraypos[1]);
        ^

我试图忽略它们但是当我执行程序时:

rafiq@rafiq-Vostro-3500:~/Desktop/AI$ ./a.out
-1500334368  
0 
0 
0 

地址和其余为零。

我不知道创建指针表并在其上存储地址的合适方法是什么,以及如何从这些地址中获取值并对其进行一些修改。

谢谢。

最佳答案

很难从问题陈述中准确确定您的意图。无论您打算声明一个 指针数组 以键入 SDL_Rect,还是您实际上打算声明一个 int 数组。不管怎样,具有(4 个元素)的数组的数组索引是 0-3,C 中的所有数组都是 索引。例如:

arraypos[0]
arraypos[1]
arraypos[2]
arraypos[3]

要键入的指针数组示例

根据您对问题陈述的编辑,您声明您想要“创建一个指针表并在其上存储地址”。如果您的意图是声明一个类型为 SDL_Rect 的指针数组 (4),那么以下内容是可以的:

SDL_Rect *arraypos[4];

当您这样做时,arraypos 的每个元素都是一个指向 SDL_Rect 类型的未分配指针。这没有任何问题,但您必须明白,这与声明 4 类型的单独指针没有什么不同SDL_Rect(例如 SDL_Rect *pointer1; 然后 SDL_Rect *pointer2;, 等等...) 这将简单地声明 4-未分配 SDL_Rect 类型的指针。

这意味着尝试将一个整数值的地址单独存储为arraypos 的一个元素将违反严格别名规则,即使SDL_Rectint 的大小相同。 (参见:C 标准的第 6.5.6 和 6.5.7 节)

您可以在每个元素中正确存储的是类型SDL_Rect 的地址。因此,如果您有 poskeyposletter 静态声明类型 SDL_Rect,您可以进行以下分配:

arraypos[0] = &poskey;
arraypos[1] = &posletter;

每个 arraypos 元素现在都包含一个指向(例如 a 的 address)类型 SDL_Rect 的指针。然后,您可以通过以下方式访问每个地址的 x、y、w、h 值:

arraypos[0]->x;
arraypos[0]->y;
arraypos[1]->x;
arraypos[1]->y;
...

使用这种情况的通用结构的一个简短示例是:

包括

typedef struct {
    int x;
    int y;
} SDL_Rect;

int main (void) {

    SDL_Rect poskey = { 5, 9 };
    SDL_Rect posletter = { 3, 7 };

    SDL_Rect *arraypos[4] = {NULL};
    size_t i;

    arraypos[0] = &poskey;
    arraypos[1] = &posletter;
    /* arraypos[2] & arraypos[3] are not used in this case */

    for (i = 0; i < 2; i++) {
        printf (" arraypos[%zu]->x : %d\n", i, arraypos[i]->x);
        printf (" arraypos[%zu]->y : %d\n", i, arraypos[i]->y);
    }

    return 0;
}

输出

$ ./bin/arraypos2
 arraypos[0]->x : 5
 arraypos[0]->y : 9
 arraypos[1]->x : 3
 arraypos[1]->y : 7

整数数组示例

另一方面,您正在为 arraypos 的每个元素分配 int 值,因此看起来您需要一个整数数组,例如:

int arraypos[4] = {0};   /* always initialize your variables */

然后您将 arraypos 声明为 int 4 类型的*数组。然后,您可以将整数值分配给每个索引位置0-3(记住——所有数组都是索引 在 C) 中。一个简短的例子(没有 SDL_Rect,但使用通用结构)是:

#include <stdio.h>

typedef struct {
    int x;
    int y;
} SDL_Rect;

int main (void) {

    SDL_Rect poskey = { 5, 9 };
    SDL_Rect posletter = { 3, 7 };
    int arraypos[4] = {0};
    size_t i;

    arraypos[0] = poskey.x;
    arraypos[1] = poskey.y;
    arraypos[2] = posletter.x;
    arraypos[3] = posletter.y;

    for (i = 0; i < sizeof arraypos/sizeof *arraypos; i++)
        printf (" arraypos[%zu] : %d\n", i, arraypos[i]);

    return 0;
}

输出

$ ./bin/arraypos
 arraypos[0] : 5
 arraypos[1] : 9
 arraypos[2] : 3
 arraypos[3] : 7

想一想您要实现的是哪种情况,如果您还有其他问题,请告诉我。

关于c - 从指针数组中存储/获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34562157/

相关文章:

c - 程序打印我想要的结果,除了在一个地方我得到的是内存地址而不是地址的值。

c++ - 检查任何正在运行的二进制文件是 32 位还是 64 位

c++ - 在 C 中写入 C++ 指针

Windows 中 JSON 文件的 C 库

c - 尝试使用指针从字符串中删除字符

c - 当 &variableName 是函数的参数时,它会做什么?

C Treenode 指针用全局变量改变值

javascript - 如何按下键 :value to dictionary in JavaScript?

arrays - 数组数组中特定位置的类型?

perl - 如何写出或读入 Perl 散列的数组?