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

摘要:
2011年4月9日17:42:57C中字符串数组和字符串指针之间的差异。从上面的截图中,我们可以看到字符数组和字符串之间的区别。还可以发现,虽然pname和p是两个不同的指针,但它们都指向相同的地址,这也是编译器机会主义的地方。因为它们都指向字符串“fangzhen”,所以编译器只存储它们一次。使用&“芳珍”也是可以接受的。

2011年4月9日17:42:57

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

C中数组与指针及多维数组第1张

C中数组与指针及多维数组第2张

C中数组与指针及多维数组第3张

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

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

2011年4月10日11:24:40

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

第一种方法:

C中数组与指针及多维数组第4张C中数组与指针及多维数组第5张

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

C中数组与指针及多维数组第6张

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

C中数组与指针及多维数组第7张

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

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

C中数组与指针及多维数组第8张

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

C中数组与指针及多维数组第9张

具体分配的内存为:

  1. 在内存1中查看

    C中数组与指针及多维数组第10张

  2. 在内存2中查看

    C中数组与指针及多维数组第11张

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

    C中数组与指针及多维数组第12张

    具体的内存分配为:

    1. 在内存1中查看

      C中数组与指针及多维数组第13张

    2. 在内存2中查看

       

      C中数组与指针及多维数组第14张

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

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

第2中方法:

C中数组与指针及多维数组第15张

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

C中数组与指针及多维数组第16张C中数组与指针及多维数组第17张

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

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

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

C中数组与指针及多维数组第18张

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

C中数组与指针及多维数组第19张

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

C中数组与指针及多维数组第20张

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

C中数组与指针及多维数组第21张

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

C中数组与指针及多维数组第22张

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

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

C中数组与指针及多维数组第23张

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

C中数组与指针及多维数组第24张

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

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

 

2011年4月10日20:24:58

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

C中数组与指针及多维数组第25张

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

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

免责声明:文章转载自《C中数组与指针及多维数组》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇清理缓存中的头像读书笔记之:你必须知道的495个C语言问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hbctf---whatiscanary学习

题目中除了能栈溢出实在找不到其他能泄露信息的地方了。而且也没法修改GOT表,始终绕不过stack_chk_fail函数。感到无从下手。只到官方给WP了,才觉得自己基础太过浅薄了。 如果我们仔细观察崩溃的信息,可以看到stack_chk_fail打印了我们在shell中键入的命令。 图1 stack_chk_fail打印程序执行命令 这个进程名就是传递给ma...

Java同步数据结构之CopyOnWriteArrayList/CopyOnWriteArraySet

前言 前面介绍完了队列(包括双端队列),今天探讨以下Java并发包中一个List的并发数据结构实现CopyOnWriteArrayList,顾名思义CopyOnWriteArrayList也是一种基于数组的类似ArrayList的集合,CopyOnWriteArrayList比起ArrayList最大的区别在于,CopyOnWriteArrayList实现...

最简单的HashMap底层原理介绍

HashMap底层原理 1.HashMap底层概述 2.JDK1.7实现方式 3.JDK1.8实现方式 4.关键名词 5.相关问题 1.HashMap底层概述 在JDK1.7中HashMap采用的是 数组Array 和 链表Link 这两种数据结构,而在JDK1.8中对底层实现进行了优化,开始采用 数组 链表 和 红黑树....

nm 命令能够显示目标文件中重载函数的名字改变(C++)

#include <stdio.h> #include <iostream> using std::cout; using std::endl; //这里的两个不同的add函数根据函数的参数个数不同,编译为目标文件后 //名字发生变化 int add(int x = 0, int y = 0) { return x + y;...

Numpy应用100问

对于从事机器学习的人,python+numpy+scipy+matplotlib是重要的基础;它们基本与matlab相同,而其中最重要的当属numpy;因此,这里列出100个关于numpy函数的问题,希望读者通过“题海”快速学好numpy;题中示例可以粘贴运行,读者可以边执行边看效果; 1 如何引入numpy? import numpy as np(或者f...

JAVA-初步认识-第五章-数组-常见操作-排序的性能问题

一. 这里对前面的选择排序操作进行了深化,之前讨论的选择排序是将0角标上的数据和后面角标的数据一个个进行对比,不断地调换数据的位置,直到0角标上的数据是整个数组中的最小值。由于调换的次数较多,现在引发一个疑问,能不能直接将0角标的数据和最小数据进行对换(前提是知道最小数据的角标是多少)。 之前的例子里,选择排序中,进行了三次比较调换数据,才使得角标0上的数...