首先,系统给数据分配内存以存储数据,每个存放数据的内存对应一个地址,那么系统是不是也要给这个地址分配内存呢?
对于二维数组a[3][3],我们要找到a[1][2]的值可以寻地址*(*(a+1)+2)找到,这个过程是两个寻地址过程:1、a+1这个是地址运算(地址a+1),寻地址*(a+1)找到的是a[1]这个地址(&a[1][0]),2、再次进行地址运算a[1]+2,找到了a[1][2]的地址(&a[1][2]),通过寻地址运算找到这个数,*(a[1]+2)上面知道*(a+1)就是地址a[1],把*(a[1]+2)中的a[1]换掉就是*(*(a+1)+2)了,(整个过程是这样的吧,自己看书时感觉是这个意思)
我的疑问是:在第一次寻找的时候,*(a+1)这个寻址过程找到的应该是(a+1)这个地址对应的内存吧,然后*(a+1)得到a[1]这个地址,那这个地址就储存在前面说的那个内存中吗?谢谢了,讲的越清楚越好,不会的名词我会gogle的。。。
系统怎么对二维数组分配内存的?
答案:4 悬赏:40 手机版
解决时间 2021-03-18 06:50
- 提问者网友:了了无期
- 2021-03-17 21:24
最佳答案
- 五星知识达人网友:洎扰庸人
- 2021-03-17 22:47
你地址和内存的概念很混啊,每一块内存都有自己的地址,即使是一个位都有自己的地址,假设int a;那么a就分配了一个整形数据的内存,必然有一块地址,但是int 大小是4个字节也就是32个位,那么&a只是返回了一个值,那个是这个32位的第一位的地址,由于限定了类型就等于把32位包装在一起了,只要知道了第一位,就找到了整个32位对不?后来你(ˇˍˇ) 想~要着到列的坐标,由于限定了类型INT的话,加法运算就是按32位加了,你不会还一位一位的加吧,那样两个数据的存数内存不是叠放在一起吗。。必然不行,所以是加了32位,当然数组类型是char就是加8位,还有只能说为内存是地址别名,只是这个地址能放数据罢了,只能说为一块内存非配一块地址,地址和内存间没有“存储”这个词每一个位都是一块内存,每一个块内存即使是一个位,都有一块地址,两者是等价的!!!!“那这个地址就储存在前面说的那个内存中吗?”所以这个问题本身就不成立。打个比方吧,你是一个人,你的名字叫A。那么我要和你说话,我怎么才能让你知道我说话的那个人是你而不是别人呢,那么我用手指着你,你就知道了吧,或者我喊你的名字A,你也会知道吧,分配内存就是指向你这个动作,而地址就是你名字A,两者没本质区别,分配一个内存就是给这个取了一个名字罢了,内存一直存在,就像你一直都再,至于你叫什么?可以叫A也可以叫B,是A是B是由分配这个过程决定的。
全部回答
- 1楼网友:低音帝王
- 2021-03-18 00:06
*(*(a+1)+2)找不到a[1][2]吧…………
内存应该是这样的,我给你画一下就知道了
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
- 2楼网友:一袍清酒付
- 2021-03-17 23:20
因为我使用了断言,需要包含头文件:#inlcude <assert.h>。使用的时候就像正常的二维数组一样就行了。
int **a, i;
a = (int **)malloc(sizeof(int *) * n);
assert(a != NULL);
for (i = 0; i < n; ++i) {
a[i] = (int *) malloc(sizeof(int) * n);
assert(a[i] != NULL);
}
for (i = 0; i < n; ++i) {
free(a[i]);
}
free(a);
a = NULL;
上面是动态分配二维数组的方法。其实在C语言中不存在多为数组,只有一位数组,所谓的二维数组只不过是每个数组的元素是数组而已,这样你就好理解了吧。
- 3楼网友:躲不过心动
- 2021-03-17 23:04
new一个n*n的二维float数组, float **a = new float*[n]; for(int i = 0;i < n;i++) { a[i] = new float[n]; } 释放内存的时候倒过来 for(int i = 0;i < n;i++) { delete[] a[i]; } delete a; m个区间,每个区间的点数可以不确定, 那首先还得确认m和,每个区间的点数的多少,当然,自己定 伪代码: int i,m; pointcloud **p_allpoint= new pointcloud * [m]; 然后确定每个区间的点数,假设存到一个数组中int a[m]={}; //因为有m个区间 再确定需要的各自的空间: for(i=0;i<m;i++) p_allpoint[i]=new pointcloud [a[i]];
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯