您的位置:首页 > 编程语言 > C语言/C++

深入理解C指针学习笔记---多级指针的内存分配问题(五)

2016-03-25 21:13 495 查看

1.4多级指针的理解与用法

1.41二维数组在内存中的布局

直观上理解,二位数组array[m]
在内存中的布局应该是一个m*n的矩阵,就像下表这样a[3][4]。



而实际上内存是一个连续的空间,二维数组内存中的存储方式和一维数组的存储方式是相同的都是线性的,如下图所示:



虽然我们通常使用数组的下标的方式来访问数组中的某个元素:a[i][j],编译器总是吧二维数组看做一维数组,而一维数组的每一个元素又都是一个数组(这种思想在给多维数组进行内存分配时起到很大的作用)。例如a[3][4]:

a[3]这个数组中由三个元素a[0],a[1],a[2],他们的首地址分别是:&a[0], &a[0]+sizeof(int)*4, &a[0]+sizeof(int)*4*2。也就是a[i]的首地址是&a[0]+sizeof(int)*4*i。

每一个元素都是一个指针类型(int*),每个元素又代表一个数组,这个数组里面有4个元素。故a[i][j]的地址是a+i*sizeof(int)*4+j*sizeof(int);

通过上节讲的指针的运算符,我们可以知道,我们可以通过指针来访问数组的一个元素a[i][j],即等价与((a+i)+j);

其中a+i时,a的移位是a[0]的大小,当*(a+i)+j中的+j时,此时的移位是移的a[0][0]的大小。所以可以通过指针来访问。

1.42二级指针在内存中的布局

二级指针的用处十分广泛,,尤其是和二维数组混合在一起的时候更加麻烦。例如:

int **p;


一级指针和二级指针的不同是,一级指针保存的是数据的地址,而二级指针保存的是一级指针的地址。

给二级指针分配内存的方法(代码如下):

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
int main() {
int array_number = 4, element_number = 4, array_index, element_index;
int **ptr;
ptr = (int**)malloc(sizeof(int*) * array_number);
if(!ptr) {
printf("\nMemory allocation Faliure!\n\n");
exit(-1);
}

for (array_index = 0; array_index< array_number; array_index++) {
ptr[array_index] = (int*)malloc(sizeof(int) * element_number);

if (!ptr[array_index]) {
printf("\nMemory  allocation Faliure!\n\n");
exit(-1);
}
}
for (array_index = 0; array_index < array_number; array_index++) {
for (element_index = 0; element_index < element_number; element_index++) {
*(*(ptr+array_index) + element_index) = (array_index + 1) * (element_index + 1);
}
}

for (array_index = 0; array_index < array_number; array_index++) {
for (element_index = 0; element_index < element_number; element_index++) {
printf("%d ", *(*(ptr + array_index) + element_index));
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息