我想创建一个数组,我可以在其中添加一些变量地址,然后从地址中获取它们的值,
代码如下:
SDL_Rect *arraypos[4];
arraypos[1] = &poskey.x;
arraypos[2] = &poskey.y;
arraypos[3] = &posletter.x;
arraypos[4] = &posletter.y;
posletter
和 poskey
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_Rect
和 int
的大小相同。 (参见:C 标准的第 6.5.6 和 6.5.7 节)
您可以在每个元素中正确存储的是类型SDL_Rect
的地址。因此,如果您有 poskey
和 posletter
静态声明类型 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
想一想您要实现的是哪种情况,如果您还有其他问题,请告诉我。