-1

如果我创建一个变量说:

int a[10];

我正在创建一个变量并使用上述变量的地址空间来存储值。那么如何识别上述变量的地址空间呢??

4

3 回答 3

1

如果要打印变量的地址,请执行

int a[10];
int i;
int *p = &i;
printf("Address of a : %p \n", (void *)a);
printf("Address of i : %p \n", (void *)&i);

//to update i using pointer do
*p = 100; //or even p[0] = 100;


//a is array which is actually a pointer so you can update its elements as
a[0] = 10; //for 1st elem
a[1] = 100; //for 2nd elem etc.
//you can do this too
p = a;
p[0] = 10;
p[1] = 100;

如果您的意思是获得实际的物理地址,那么它不容易获得。

于 2013-11-11T10:13:11.843 回答
1

数组的内存地址范围从地址 a[0] 到地址 a[9]。您可以使用 获取起始地址&a[0]

地址空间是指不同硬件组件(如 RAM、io 设备等)的地址范围。

于 2013-11-11T10:16:15.507 回答
0

Sachin - 如果您正在为没有虚拟内存的嵌入式系统编写代码,您可以编写物理地址位置。例如,如果您想编写一些 8 位长且地址为 0x123 的内存映射寄存器等,您可以这样做:

*((unsigned char*)0x123) = 45;

它将执行的操作是将值 45(十进制)写入物理地址 0x123。

的意思:

 *((unsigned char*)0x123)

如下:

(unsigned char*)0x123 // cast value 0x123 to pointer to unsigned char

这意味着将 0x123 视为无符号 8 位值的地址

和整个东西:

*((unsigned char*)0x123) = 45;

将使用通过 (unsigned char*)0x123 获取的指针将值 45 写入地址 0x123。

一般来说(在嵌入式系统上):

// assuming:
//  C - pointer to 8bit entity
//  S - pointer to 16bit entity
//  I - pointer to 32bit entity
*(C) = 8bit_val;   // will write 8bit **value** to physical address pointed by C
*(S) = 16bit_val;  // will write 16bit **value** to physical address pointed by S
*(I) = 32bit_val;  // will write 32bit **value** to physical address pointed by I

这真的很简化,但这会做你想要的。如果您想将数组、结构或常规变量放在特定的物理地址,可以在嵌入式系统上完成(例如,您必须阅读有关 ARM 编译器上的分散加载)。Scater 文件将允许您将数组放置您想要的任何位置,并且您将能够使用常规语法访问它,而无需显式使用指针。

但是,在 Windows 平台上,您将无法做到这一点,因为您不使用物理地址,而是使用所谓的虚拟内存,其中您有一些理论上是地址但与物理地址无关的值。它太宽泛了,无法解释。这是一个巨大的主题。

这是有关分散加载的一些信息

于 2013-11-11T13:44:27.407 回答