我目前正在尝试学习如何以各种方式在内存中写入内容,即我正在玩。
我已经创建了一个结构,如下:
struct strProjectile
{
int Damage;
int ParticlesPerSecond;
short Fire;
short Plasma;
};然后,我创建了一个数组,如下所示:
strProjectile Projectiles[40];然后,我从该数组创建了一个指针,指向数组的开头:
strProjectile *ptrProjectiles;
ptrProjectiles = Projectiles;使用该指针,您可以像这样设置变量中的值(我知道这可以直接完成,而不是使用指针。符号):
ptrProjectiles->Damage = 0;
ptrProjectiles->ParticlesPerSecond = 0;
ptrProjectiles->Fire = 0;
ptrProjectiles->Plasma = 0;我还发现可以通过在数组的每个结构中创建一个指向每个变量的指针来设置变量中的值。例如,以下代码会将Damage设置为0:
int *Damage = (int *)ptrProjectiles;
*Damage = 0;我的问题是,我是否可以使用指向数组的指针直接在内存中设置结构中的每个变量,就像我在上面使用单独的指针进行破坏一样?使用像这样的东西:
*ptryProjectiles = 0;然后跳过4个字节的内存以获取结构中的下一个变量(在本例中为ParticlesPerSecond),设置该变量,然后再跳过4个字节并设置下一个变量(在本例中为Fire),然后跳过下2个字节并设置下一个变量(在本例中为to ),然后再跳过2个字节以获取数组中的下一个对象,然后重复...
我看不出我需要这样做的原因,但我只是想知道是否可以这样做,以帮助我完全理解……
提前感谢!
发布于 2014-12-30 03:50:16
通常,直接通过数组对结构数组进行寻址,如下所示:
strProjectiles2.Damage=0;
如果需要单个元素,请执行以下操作:
Projectile * p= &strProjectiles[3];
p->Damage=0;
(*p).Fire=1;发布于 2014-12-30 03:58:21
在下面的语句中,您假设int Damage;始终是第一个字段:
int *Damage = (int *)ptrProjectiles;这很容易出现将来的bug,不应该使用。如果只想在每个结构中设置int Damage;字段,可以使用use a loop:
strProjectile Projectiles[MAX_PROJECTILES];
strProjectile *ptrProjectiles = Projectiles;
for(i = 0; i < MAX_PROJECTILES; i++)
(ptrProjectiles + i)->Damage = 0;更新
计算每个结构的第一个字段的地址是可能的,尽管很危险,如下所示:
int *pDamage = (int *)Projectiles;
for(i = 0; i < MAX_PROJECTILES; i++)
{
*pDamage = 0;
pDamage = (void *)pDamage + sizeof(Projectiles[0]);
}发布于 2014-12-30 04:02:01
TLDR:是的,但你可能不应该这样做。
你完全可以在C语言中做到这一点,你甚至可以接受一个字节流,并将其类型转换为你的结构,然后立即填充所有的数据成员。
其中的细微差别是它不是可维护的代码,所以...可能不是个好主意。另一点需要注意的是,一旦你完成了这种类型的变量访问/设置,你就与你的数据结构结婚了。如果不重新编写所有的代码,你就不能真正地改变它,移动变量,添加额外的数据成员或其他任何东西。
https://stackoverflow.com/questions/27695016
复制相似问题