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中查看
- 在内存2中查看
第3个int*所在位置为0x003c1580(从下图的蓝色框内可以看出)
具体的内存分配为:
- 在内存1中查看
- 在内存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个字节的,他们的内存是连续的.
通过比较上面的两个函数, 我们也可以看到, 其实不同在于, 第一个的空间是分散的, 第二个的空间是连续的.