深入理解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"); } }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 关于指针的一些事情
- 如何写好 C main 函数
- Lua和C语言的交互详解
- Lua中使用二维数组实例
- C# Pointer指针应用实例简述
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言