int **a[3][4]占用的大小是多少?

2024-05-05 00:58

1. int **a[3][4]占用的大小是多少?

12个int 指针的指针,32位平台指针占用4字节,因此是48字节
64位机应该是*2.

int **a[3][4]占用的大小是多少?

2. int **a[3][4]占多少字节?

48
**a[3][4]是一个数组,有12个单元这没什么问题吧。
现在就来看他里面存的是什么。
因为而数组存的内容是指针,win32下无论什么指针都是占4个字节。
所以12 * 4 = 48;

不信你再在前面多加几个*号,看下结果是不是一样。

纠正下楼上的。

 i=sizeof("int **a[3][4]");

你这个要这样用  i=sizeof( a );

3. 各大公司笔试题及答案

腾讯笔试题:const的含义及实现机制
const的含义及实现机制,比如:const int i,是怎么做到i只可读的?
const用来说明所定义的变量是只读的。
这些在编译期间完成,编译器可能使用常数直接替换掉对此变量的引用。
更多阅读:
http://www.92ask.net/Archive/?action=show&id=18
初探编译器static、const之实现原理
腾讯笔试题:买200返100优惠券,实际上折扣是多少?
到商店里买200的商品返还100优惠券(可以在本商店代替现金)。请问实际上折扣是多少?
由于优惠券可以代替现金,所以可以使用200元优惠券买东西,然后还可以获得100元的优惠券。
假设开始时花了x元,那么可以买到 x + x/2 + x/4 + ...的东西。所以实际上折扣是50%.(当然,大部分时候很难一直兑换下去,所以50%是折扣的上限)
如果使用优惠券买东西不能获得新的优惠券,那么
总过花去了200元,可以买到200+100元的商品,所以实际折扣为 200/300 = 67%.
腾讯笔试题:tcp三次握手的过程,accept发生在三次握手哪个阶段?
accept发生在三次握手之后。
第一次握手:客户端发送syn包(syn=j)到服务器。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个ASK包(ask=k)。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。
三次握手完成后,客户端和服务器就建立了tcp连接。这时可以调用accept函数获得此连接。
腾讯笔试题:用UDP协议通讯时怎样得知目标机是否获得了数据包
用UDP协议通讯时怎样得知目标机是否获得了数据包?
可以在每个数据包中插入一个唯一的ID,比如timestamp或者递增的int。
发送方在发送数据时将此ID和发送时间记录在本地。
接收方在收到数据后将ID再发给发送方作为回应。
发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。
关于UDP协议的简单介绍,可以参考
http://baike.baidu.com/view/30509.htm
腾讯笔试题:统计论坛在线人数分布
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
一天总共有 3600*24 = 86400秒。
定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。
然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。
这样处理一遍后数组中存储了每秒中的人数变化情况。
定义另外一个长度为86400的整数数组int online_num[86400],每个整数对应这一秒的论坛在线人数。
假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0] = delta[0]。第n+1秒的人数online_num[n] = online_num[n-1] + delta[n]。
这样我们就获得了一天中任意时间的在线人数。
腾讯笔试题:从10G个数中找到中数
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
不妨假设10G个整数是64bit的。
2G内存可以存放256M个64bit整数。
我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。
如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围(256M=2^28,所以最多需要3次就可以将此范围缩小到1,也就找到了中数)。
腾讯笔试题:两个整数集合A和B,求其交集
两个整数集合A和B,求其交集。
1. 读取整数集合A中的整数,将读到的整数插入到map中,并将对应的值设为1。
2. 读取整数集合B中的整数,如果该整数在map中并且值为1,则将此数加入到交集当中,并将在map中的对应值改为2。
通过更改map中的值,避免了将同样的值输出两次。
腾讯笔试题:找出1到10w中没有出现的两个数字
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?
申请10w个bit的空间,每个bit代表一个数字是否出现过。
开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。
然后依次读入已经打乱循序的数字,并将对应的bit设为1。
当处理完所有数字后,根据为0的bit得出没有出现的数字。
首先计算1到10w的和,平方和。
然后计算给定数字的和,平方和。
两次的到的数字相减,可以得到这两个数字的和,平方和。
所以我们有
x + y = n
x^2 + y^2 = m
解方程可以得到x和y的值。
腾讯笔试题:需要多少只小白鼠才能在24小时内找到毒药
有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?
最容易想到的就是用1000只小白鼠,每只喝一瓶。但显然这不是最好答案。
既然每只小白鼠喝一瓶不是最好答案,那就应该每只小白鼠喝多瓶。那每只应该喝多少瓶呢?
首先让我们换种问法,如果有x只小白鼠,那么24小时内可以从多少瓶水中找出那瓶有毒的?
由于每只小白鼠都只有死或者活这两种结果,所以x只小白鼠最大可以表示2^x种结果。如果让每种结果都对应到某瓶水有毒,那么也就可以从2^x瓶水中找到有毒的那瓶水。那如何来实现这种对应关系呢?
第一只小白鼠喝第1到2^(x-1)瓶,第二只小白鼠喝第1到第2^(x-2)和第2^(x-1)+1到第2^(x-1) + 2^(x-2)瓶....以此类推。
回到此题,总过1000瓶水,所以需要最少10只小白鼠。
腾讯笔试题:根据上排的数填写下排的数,并满足要求。
根据上排给出十个数,在其下排填出对应的十个数, 要求下排每个数都是上排对应位置的数在下排出现的次数。上排的数:0,1,2,3,4,5,6,7,8,9。
腾讯笔试题:判断数字是否出现在40亿个数中?
给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?
答案:
unsigned int 的取值范围是0到2^32-1。我们可以申请连续的2^32/8=512M的内存,用每一个bit对应一个unsigned int数字。首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即 可。
1、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句#define Max(a,b) ( a/b)?a:b
2、如何输出源文件的标题和目前执行行的行数
int line = __LINE__;
char *file = __FILE__;
cout<<"file name is "<<(file)<<",line is "< 
3、两个数相乘,小数点后位数没有限制,请写一个高精度算法
4、写一个病毒
while (1)
{
int *p = new int[10000000];
}
5、不使用额外空间,将 A,B两链表的元素交*归并
6、将树序列化 转存在数组或 链表中
struct st{
int i;
short s;
char c;
};
sizeof(struct st);
7、
char * p1;
void * p2;
int p3;
char p4[10];
sizeof(p1...p4) =?
8、
4,4,4,10
二分查找
快速排序
双向链表的删除结点
面试基本上都是和项目相关的,并当场说几个程序题的输出,不能用草稿纸

微软笔试题:写程序找出二叉树的深度
一个树的深度等于max(左子树深度,右子树深度)+1。可以使用递归实现。
假设节点为定义为
1.	struct Node {  
2.	Node* left;  
3.	Node* right;  
4.	};  
5.	int GetDepth(Node* root) {  
6.	if (NULL == root) {  
7.	return 0;  
8.	}  
9.	int left_depth = GetDepth(root->left);  
10.	int right_depth = GetDepth(root->right);  
11.	return left_depth > right_depth ? left_depth + 1 : right_depth + 1;  
12.	} 
微软笔试题:利用天平砝码,三次将140克的盐 分成50、90克两份?
有一个天平,2克和7克砝码各一个。如何利用天平砝码在三次内将140克盐分成50,90克两份。
第一种方法:
第一次:先称 7+2克盐 (相当于有三个法码2,7,9)
第二次:称2+7+9=18克盐 (相当于有2,7,9,18四个法码)
第三次:称7+18=x+2,得出x是23,23+9+18=50克盐.
剩下就是90克了.
第二种方法:
1.先把140克盐分为两份,每份70克
2.在把70克分为两份,每份35克
3.然后把两个砝码放在天平两边,把35克面粉分成两份也放在两边(15+7=20+2)
现在有四堆面粉70,35,15,20,分别组合得到
70+20=90
35+15=50
微软笔试题:地球上有多少个满足这样条件的点
站在地球上的某一点,向南走一公里,然后向东走一公里,最后向北走一公里,回到了原点。地球上有多少个满足这样条件的点?
北极点满足这个条件。
距离南极点很近的一个圈上也满足这个条件。在这个圆圈上,向南走一公里,然后向东走一公里恰好绕南极点一圈,向北走一公里回到原点。
所以地球上总共有无数点满足这个条件。
或者
首先,在地球表面上,南北走向是沿着经度方向,东西是沿着纬度方向。如果你一直往北走就会达到北极点,往南走就到了南极点。因此,向南走一公里,然 后向东走一公里,最后向北走一公里,回到了原点,一种情况就是,出发点是在北极点,这样向南走一公里,然后向东走任意几公里,最后向北走一公里,最后都会 回到北极点;
其次,可以这么认为如果从A点向南走一公里到达B点,那么若向东走一公里能回到B,那么最后向北走一公里,就能回到了原点A。这样就可以先找出在南 北极点附近找出绕一周只有1公里的圈,那么这个圈落在南极附近时,只要往北推1公里,此时该圈上的点都能满足;若这个圈落在北极附近时,能不能往北推1公 里我就不分析了。反正在南极附近能找到任意多个点就能回到这个问题了
微软笔试题:正确标注水果篮
有三个水果篮。其中一个里面只有苹果,一个里面只有橘子,另外一个既有苹果又有橘子。每个水果篮上都有标签,但标签都是错的。如何检查某个水果篮中的一个水果,然后正确标注每个水果篮?
从标注成既有苹果也有橘子的水果篮中选取一个进行检查。
如果是橘子,则此篮中只有橘子;标有橘子的水果篮中只有苹果;标有苹果的水果篮中既有苹果也有橘子。
如果是苹果,则此篮中只有苹果;标有苹果的水果篮中只有橘子;标有橘子的水果篮中既有苹果也有橘子。
微软笔试题:不利用浮点运算,画一个圆
不利用浮点运算,在屏幕上画一个圆 (x**2 + y**2 = r**2,其中 r 为正整数)。
考虑到圆的对称性,我们只需考虑第一象限即可。
等价于找到一条连接点(0,r)到点(r,0)的一条曲线,曲线上的点距圆心(0,0)的距离最接近 r。
我们可以从点(0,r)开始,搜索右(1,r),下(0,r-1),右下(1,r-1)三个点到圆心的距离,选择距圆心距离最接近 r 的点作为下一个点。反复进行这种运算,直至到达点(r,0)。
由于不能利用浮点运算,所以距离的比较只能在距离平方的基础上进行。也就是比较 x**2 + y**2 和 r**2之间的差值。
微软笔试题:将一个句子按单词反序
将一个句子按单词反序。比如 “hi baidu com mianshiti”,反序后变为 “mianshiti com baidu hi”。
可以分两步走:
第一步按找字母反序,“hi baidu com mianshiti” 变为 “itihsnaim moc udiab ih”。
第二部将每个单词中的字母反序,“itihsnaim moc udiab ih” 变成 “mianshiti com baidu hi”。
这个方法可以在原字符串上进行,只需要几个整数变量来保持指针即可,空间复杂度低。
微软笔试题:计算n bit的整数中有多少bit 为1
设此整数为x。
方法1:
让此整数除以2,如果余数为1,说明最后一位是1,统计值加1。
将除得的结果进行上面运算,直到结果为0。
方法2:
考虑除法复杂度有些高,可以使用移位操作代替除法。
将 x 和 1 进行按位与操作(x&1),如果结果为1,说明最后一位是1,统计值加1。
将x 向右一位(x >> 1),重复上面过程,直到移位后结果为0。
方法3:
如果需要统计很多数字,并且内存足够大,可以考虑将每个数对应的bit为1的数量记录下来,这样每次计算只是一次查找操作。
1.	int n = 0;while (x)  
2.	{  
3.	xx = x & (x - 1);  
4.	n++;  
5.	}  
6.	return n; 
微软笔试题:快速求取一个整数的7倍
乘法相对比较慢,所以快速的方法就是将这个乘法转换成加减法和移位操作。
可以将此整数先左移三位(×8)然后再减去原值:X << 3 - X。
微软笔试题:判断一个数是不是2的n次幂
设要判断的数是无符号整数X。
首先判断X是否为0,如果为0则不是2的n次幂,返回。
X和X-1进行按位与操作,如果结果是0,则说明这个数是2的n次幂;如果结果非0,则说明这个数不是2 的n次幂。
证明:
如果是2的n次幂,则此数用二进制表示时只有一位是1,其它都是0。减1后,此位变成0,后面的位变成1,所以按位与后结果是0。
如果不是2的n次幂,则此数用二进制表示时有多位是1。减1后,只有最后一个1变成0,前面的 1还是1,所以按位与后结果不是0。
微软笔试题:三只蚂蚁不相撞的概率是多少
在三角形的三个顶点上各有一只蚂蚁,它们向另一个顶点运动,目标随机(可能为另外两个顶点的任意一个)。问三只蚂蚁不相撞的概率是多少?
如果蚂蚁顺时针爬行记为0,逆时针爬行记为1。那么三只蚂蚁的状态可能为000,001,...,110,111中的任意一个,且为每种状态的概率相等。在这8种状态中,只有000和111可以避免相撞,所以蚂蚁不相撞的概率是1/4。
微软笔试题:判断数组中是否包含重复数字
给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)
微软笔试题:如何将蛋糕切成相等的两份
一块长方形的蛋糕,其中有一个小长方形的空洞(角度任意)。使用一把直刀,如何一刀将蛋糕切成相等的两份?
通过长方形中心的的任意直线都能将长方形等分,所以连接两个长方形的中心点的直线可以等分这个蛋糕。
一个没有排序的链表,比如list={a,l,x,b,e,f,f,e,a,g,h,b,m},请去掉重复项,并保留原顺序,以上链表去掉重复项后为newlist={a,l,x,b,e,f,g,h,m},请写出一个高效算法(时间比空间更重要)。
建立一个hash_map,key为链表中已经遍历的节点内容,开始时为空。
从头开始遍历链表中的节点:
- 如果节点内容已经在hash_map中存在,则删除此节点,继续向后遍历;
- 如果节点内容不在hash_map中,则保留此节点,将节点内容添加到hash_map中,继续向后遍历。
微软笔试题:小明一家5口如何过桥?
小明一家过一座桥,过桥时是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问:小明一家如何过桥?
小明与弟弟过去,小明回来,用4s;
妈妈与爷爷过去,弟弟回来,用15s;
小明与弟弟过去,小明回来,用4s;
小明与爸爸过去,用6s;
总共用29s。
题目的关键是让速度差不多的一起走,免得过于拖累较快的一个人。
微软笔试题:编一个程序求质数的和
编一个程序求质数的和,例如F(7) = 2+3+5+7+11+13+17=58。
方法1:
对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的数依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,对其进行加和。
空间复杂度为O(1),时间复杂度为O(n^2),其中n为需要找到的最大质数值(例子对应的值为17)。
方法2:
可以维护一个质数序列,这样当需要判断一个数是否是质数时,只需判断是否能被比自己小的质数整除即可。
对于从2开始的递增整数n进行如下操作:
用 [2,n-1] 中的质数(2,3,5,7,开始时此序列为空)依次去除n,如果余数为0,则说明n不是质数;如果所有余数都不是0,则说明n是质数,将此质数加入质数序列,并对其进行加和。
空间复杂度为O(m),时间复杂度为O(mn),其中m为质数的个数(例子对应的值为7),n为需要找到的最大质数值(例子对应的值为17)。
方法3:
也可以不用除法,而用加法。
申请一个足够大的空间,每个bit对应一个整数,开始将所有的bit都初始化为0。
对于已知的质数(开始时只有2),将此质数所有的倍数对应的bit都改为1,那么最小的值为0的bit对应的数就是一个质数。对新获得的质数的倍数也进行标注。
对这样获得的质数序列累加就可以获得质数和。
空间复杂度为O(n),时间负责度为O(n),其中n为需要找到的最大质数值(例子对应的值为17)。

各大公司笔试题及答案

4. 前几天去华为赛门铁克笔试,有一道题:int a[5][5]; int (*p)[3]; p = a; &p[4][2]-&a[4][2]=?

首先:p=a;是非法的,类型不同
a的地址要给d得强制转换: p=(int(*)[3])a;
这样的话&p[4][2]-&a[4][2] =a+3*4+2-(a+5*4+2) = 14-22= -8

5. c语言问题: 1.已知int a[10];占用内存(? )个字节的存储单元,代表他们的首地址是(?)

1.在32位机子上,int占4个字节,int a[10]有10个元素,故有40个字节,但是,C语言的考题是在考察的是TC环境,即每个int变量占2个字节,因此,这里填的是20,他的首地址即第一个元素的地址,那么,而数组名即代表数组的首地址,因此可以填a,当然,第一个元素的地址也是数组的首地址,所以填&a[0]也可以~~
2.因为a中有6个元素,而数组的下表从0到n-1,所以,最大下标是5
3.因为for(i=0;i<=10;i++)中i=0是在进入循环体前执行的,而且在整个循环的过程中,只执行一次,所以,将它放在前面也能达到相同的效果。。。所以选A
4.首先,A显然是错误的,只有当i的值比100大的时候,才结束循环体,B:x=0时,执行printf,故B错,C:由B选项的分析可知,C错,D:由于循环体执行100次,而当输入的是非负整数时,变将其输出,故最多可以输出100个非负整数,即选D

如果还有什么不明白的话,可以继续追问~~~

c语言问题: 1.已知int a[10];占用内存(? )个字节的存储单元,代表他们的首地址是(?)

6. java中二维数组int a[][]={{1,2,3},{3,4,5,6}};在内存中占几个int单元?怎样查看?

debug呗

7. 请问:执行int a=4; (++a)+=a;之后,a值是多少?为什么??

表达式是对的
最后a的值是10
先计算a++, a就变为5
然后计算 a+=a,也就是a=a+a,a就变为10了
++的优先级高与 +=

(++a)+=a++; 是11  和上面一个道理,最后再自增一下
(a++)+=a; 应该是不合法的, 已经自增了,返回是原来的a(a++),还要用自增以后的a(赋值号后面的),很显然矛盾了,自然就不合法了

PS:也就是a++不是内存单元,而仅仅是返回一个值,执行完a++以后,a内存单元值本身已经变了,但此时使用的还是原来的值
以下是(++a)+=a;的汇编代码
mov    dword ptr [a],4 
mov    eax,dword ptr [a] 
add    eax,1 
mov    dword ptr [a],eax 
mov    ecx,dword ptr [a] 
add    ecx,dword ptr [a] 
mov    dword ptr [a],ecx 
在自增后还要用到a这个内存单元(后三行),a++和++a在汇编实现上都是一样的,即前四行汇编

简单点记就是”a++只能作r-value.”你先记住吧,学着学着就会明白了.还有一点重要的是:++a的效率要比a++效率高(这在C++中运算符重载中能从代码中体现出来),能用++a的情况下尽量用++a.

其实根本没必要费精力研究这个,一点意义都没.写程序是建立在程序正确且易读的基础上再追求效率其它的.像这样难懂的代码是没人愿意看的,也就是咱中国式考试可能考这么无聊的问题.

PS:(++a)+=a++;汇编
mov         eax,dword ptr [a] 
add         eax,1 
mov         dword ptr [a],eax 
mov         ebx,dword ptr [a] 
add         ebx,dword ptr [a] 
mov         dword ptr [a],ebx 
mov         ecx,dword ptr [a] 
add         ecx,1 
mov         dword ptr [a],ecx 

你这问题也问得太多了吧
怎么说也再建立一个新问题,让多赚点分
本来这里回答问题就没钱赚
连赚分都这么难

请问:执行int a=4;  (++a)+=a;之后,a值是多少?为什么??

8. int (*a)[10]的问题如下

int (*a)[10]表示a是指向一个有10个整形数数组的指针。
首先a是一个指针变量,定义后在内存中分配一个4个字节的内存空间(32位机上),用来存放指针变量。无论什么类型的指针变量,都是4个字节内存空间(32位机)。此时并不存在A[10]。把*a当作整体A 则a指向A,可以这么理解,但要注意并没有A。
如果定义了数组int A[10],并且将首地址存入了a中。那么用a中的地址访问内存时,是将以A为首地址的10个连续的整形空间作为整体访问的。如果整形数据为32位。那么a+1相当于a中的内容加320。
所以a不是指向地址的,a中的内容是地址。a是指向占用320个字节内存的数组的。
常用的方法
int (*a)[10];
int b[5][10]; //二维数组,5行10列
a=b; //a指向以b开始的内存单元
(如果b[0][0]为第0行第0列)a+1,则指向b数组的第1行。每加1,跳1行。*(a+1)+2,则指向b数组的第1行第2列。b[1][2]中的值则为*(*(a+1)+2)
这样方便二维数组的访问。
 
写了这么多,给个采纳吧!
最新文章
热门文章
推荐阅读