C中数组与指针及多维数组

2011年4月9日17:42:57

C中的字符串数组与字符串指针的区别

从上面的截图,我们可以看到字符数组和字符串的差别。他们的类型是不同的,比如上面的代码中,filename的类型是char[12],而pname的类型是char*,&filename的结果是数组指针,图中显示的是char[12]*。还可以发现,对于pname和p虽然是两个不同的指针,但是他们都指向同一个地址,这也是编译器投机取巧的地方,因为他们都是指向"fangzhen"这个字符串,所以编译器就只存储一次。

还有&"fangzhen"的用法也是可以的。

2011年4月10日11:24:40

c中多维数组的内存分配过程

第一种方法:

arr值为0x002efaae8, 指向int**所在的位置,即*arr所在的位置

*arr值为0x003C4F78, 这是指向的rows个int*所在的内存位置

可以看到绿框后面还有8个初始化化为0的字节, 其实后面是(*arr)[1]和(*arr[2])的地址, 共rows(3)个int*的地址,即共3个int**

第一个int*所在的位置为0x003c1290, 没有进行初始化

第二个int*所在位置为0x003c12e0(从下图我们可以读出)

具体分配的内存为:

  1. 在内存1中查看

  2. 在内存2中查看

    第3个int*所在位置为0x003c1580(从下图的蓝色框内可以看出)

    具体的内存分配为:

    1. 在内存1中查看

    2. 在内存2中查看

       

      二维指针(int**) 占4个字节, 3个一维指针(int*)各占4个字节

      每个一维数组占16个字节, 相当于rows*cols+rows+1个整型(4个字节)

第2中方法:

(1)还没有执行第一个if

brr是*brr的地址, 即这个二维指针int**首地址

现在还没有执行对*brr分配内存,所以brr处的内存是随机的,

(2)第一个if执行完毕, 分配了3个(int*)大小的空间, 所在的内存位置为0x00244fc0

*brr的值为0x00244fc0, 其实这也是第一个int*的地址

还没有执行第二个if 之前,没有对(*brr)[0]进行空间的分配, 内存中的数都是随机数

第二个if执行之后, 为(*brr)[0]完成了空间分配, (*brr)[0]的分配所得到的内存在0x00241380处, 此时共有rows*cols*4=48个字节数

我们到0x00241380处查看, 可以发现, 所分配的48个int型内存进行了初始化

到此为止, 其实内存都已经分配完毕, 现在所要做的就是为(*brr)[1]和(*brr)[2]进行赋值.

for循环执行一次之后, 我们得到(*brr)[1]的地址, 即0x00241390, 相当于在这个内存处开始是8个int整型数(第2个一维数组)

for循环执行两次后, 我们得到(*brr)[2]的地址, 即0x002413a0, 相当于在这个内存处开始是8个int整型数(第3个一维数组)

可以发现这些地址之间是相差16个字节的,他们的内存是连续的.

通过比较上面的两个函数, 我们也可以看到, 其实不同在于, 第一个的空间是分散的, 第二个的空间是连续的.

 

2011年4月10日20:24:58

C语言中多维数组int*******的解析

对于一个int****arr;的声明,

可以这样看, 这是一个4维的数组, 具体分配空间的时候, 是利用malloc或calloc分配N个int***空间, 然后arr就是一个int****型的指针, 指向分配的int***所在的内存位置. 同样, 对于N个int***中每一个, 也是利用malloc分配N2个int**空间, 接下来的都类似

posted @ 2012-02-27 20:06  Mr.Rico  阅读(...)  评论(... 编辑 收藏