谁能讲讲c++里面是按怎样的顺序分配地址的呀

int a1=1,a2=2,a3=3,a4=4;
int*pi=&a3;
cout<<"a1="<<*(pi+2) 为什么=1
地址是怎么分配的。

int a[3]={1,2,3},*p=a;
*(p+2)==a[2];
这两个的区别在哪?
请讲清楚点
6楼 2楼错了呀

数组地址的分配是下标越大,地址越大。

至于第一种情况,定义那么多个变量,地址的分配就跟平台有关了,大多数情况下,从a1到a4是依次进栈,栈顶地址比栈底地址小,因此你用pi+2就是得到的a1的地址。

同样的道理,你可以执行一下下面的代码
int i, int a[10];
for (i = 1; i <= 10; i++)
{
a[i] = 0;
cout << "hello world!\n";
}

在这种越界的情况下,会得到你意想不到的效果。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-04-14
int a1=1,a2=2,a3=3,a4=4;
int*pi=&a3;
cout<<"a1="<<*(pi+2)
首先 a1 a2 a3 a4在内存中是连续分配的
并且 依次递减4个字节(跟机器的int类型有关 64位机 依次递减8个字节)
就像往箱子里放书 先放的在下面
而内存中的地址是上面的小,下面的大
即在内存中是---a4 a3 a2 a1 依次增大
如果在定义一个int a5那么它在内存中是在a4的前面

int a[3]={1,2,3},*p=a;
*(p+2)==a[2];
这个一次分配3个int大小的空间
并且依次与a[0] a[1] a[2]对应
即 a[0] a[1] a[2]在内存中的地址依次增大
第2个回答  2010-04-14
第一个应该不会是1,
pi首先是a3地址,这个地址偏移2个单位(数值实际为sizeof(int) * 2)后指向的地址是不明确的。声明的顺序连续不代表地址就是连续存放。所以输出不确定.

第二个首先pi是a的首地址,即a[0],偏移2个单位(同上)后就等于a的首地址移动2个单位,即a[2].
第3个回答  2010-04-14
数组地址的分配是下标越大,地址越大。

至于第一种情况,定义那么多个变量,地址的分配就跟平台有关了,大多数情况下,从a1到a4是依次进栈,栈顶地址比栈底地址小,因此你用pi+2就是得到的a1的地址。
第4个回答  2010-04-14
对第一个问题:内存中存放数据是从低地址开始,到高地址,pi为a3的地址,加2为a1的地址,加*为取该地址下的数据,所以为1
对第二个问题:a和P其实地址是一样的,只不过位置不同,但是两个都是指向数组首元素的地址,实际用的时候可以混用
第5个回答  2010-04-14
我也很诧异,竟然是a1的地址高

谁能讲讲c++里面是按怎样的顺序分配地址的呀
数组地址的分配是下标越大,地址越大。至于第一种情况,定义那么多个变量,地址的分配就跟平台有关了,大多数情况下,从a1到a4是依次进栈,栈顶地址比栈底地址小,因此你用pi+2就是得到的a1的地址。同样的道理,你可以执行一下下面的代码 int i, int a[10];for (i = 1; i <= 10; i++)...

C++DLL文件分配表方法
读取所有文件分配表,转换成字符串,已分配的转为0,未分配的转为1,每一个代码对应一个基本分配单元,顺序与文件分配表一致。然后写个类,使用正则表达式,从字符串左侧开始遍历字符串,识别连续为1的段,返回起始索引和长度,使用一个函数翻译成分配表地址,类内部做个列表,记录所有可用块的偏移量和...

闲聊c\/c++: 谈内存(大\/小端,高\/低字节,高\/低地址)
DC是最高字节[ 最左 ],放在内存的最低地址[ 最左 ] FF是最低字节[ 最右 ],放在内存的最高地址[ 最右 ] 按照这个规则,很容易知道,大端在内存存储的顺序是:DC|6E|35|FF(和rgba = 0xDC6E35FF一致的顺序)根据小端的定义:数据的高字节 保存在 内存的高地址 中,而 数据的低字节 保...

c++的“栈”是什么啊?
一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的...

求C++程序:任意从键盘输入10个整数,按从小到大的顺序排序,并输出结果...
在主函数中,初始化两个整数变量分别表示整数的个数和排名计数。然后,使用`for`循环来读取用户输入的10个整数,并在每次循环中为它们分配序号。使用排序算法,这里可以采用简单的冒泡排序方法。从数组的第一个元素开始,依次与后面的元素进行比较,如果当前元素大于下一个元素,则交换它们的位置,直到整个...

C++经典面试问题
堆区(heap) — 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,需要程序员自己申请,并指明大小,在c中malloc函数 在C++中用new运算符。首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 另外,由于找到的堆结...

莱鸟求助
c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查这种错误,认为地址分配已经成功,于是就访问0X00000000的地址,于是就发生内存违规访问,同时该进程被终止。ASCII字符填充组成的pif文件时会出现以下情况:一个非法的pif文件(用ascii字符\\''x\\...

高手帮帮忙
一、应用程序没有检查内存分配失败 程序需要一块内存用以保存数据时,就需要调用操作系统提供的“功能函数”来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是“动态内存分配”,内存地址也就是编程中的“指针”。 内存不是永远都招之即来、用之...

问一个系统的问题?
windows把内存地址0X00000000到0X0000ffff指定为分配null指针的地址范围,如果程序试图访问这一地址,则认为是错误。c\/c++编写的程序通常不进行严格的错误检查,当采用malloc来分配内存而可供分配的地址空间不够的情况下返回null指针。但是代码不检查这种错误,认为地址分配已经成功,于是就访问0X00000000的地址,于是就发生内存...

C++中getline()函数的用法
就只为 s所指向的内容分配一个字节的内存,这样当运行时,程序存那1000个字符是这样做的:先找到s所指向的内存,也就是之前分配的一个字节,存入第一个字符,然后按这个内存地址的顺序继续往下存余下的字符(因为数组是地址连续的),但这时就可能出现错误,因为除了第一个内存是之前分配了的,其他的...

相似回答
大家正在搜