由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 菜鸟问个问题,如果太简单了请原谅我的愚蠢
相关主题
Bloomberg London onsite面经C里的int和long有区别吗
大家新年好。 请教一个 c interview question (转载)请问一下关于new和delete的概念
中国人面试果然很好人C/C++里数组作函数的参数的话应该怎么写?
砸了面试,发面题二维数组问题
[C++问题]请教关于几种size of class急问offer选择
google youtube interview, 莫名被拒。。。。。。写写某银行面试题目
再问一个C的malloc( )狗家面经
How to find the size of an array? Thanks.请问以下程序运行结果
相关话题的讨论汇总
话题: 数组话题: int话题: 指针话题: 一样话题: 地址
进入JobHunting版参与讨论
1 (共1页)
x**********i
发帖数: 658
1
只知道一个整数数组的第一个元素的指针,怎么才能知道这个数组的大小?
这个题有解吗?谢谢大牛们不吝赐教了。
r*****s
发帖数: 1815
2
如果是动态分配的数组,往回找一格,一般是数组大小,这个实现相关
如果是静态数组,我个人感觉取不到。。。link结束后data段里似乎是没有长度信息的
可以再确认下。。。好多年不搞这个 记不清了
z*********n
发帖数: 1451
3

你不说语言。。假设你说的是C++,
假设你说的动态数组(new 出来的)
那答案是“可能有”。取决于你的编译器,因为这是IB的。
不同编译器会把数组长度或者类似信息存在数组头指针前。为啥可能有呢,因为编译器
未必存的就是exactly的你的数组大小,可能考虑alignment,会多寸点。而且有的编译
器(我不知道哪个)也许不存这个信息,也是符合标准的。
如果是静态数组,如果你手里的那个是个真正的指针而非数组名,那应该就没戏了。因
为数组长度在编译时间存到了符号表里,运行时间不需要额外空间存储它,你也就拿不
到了。

【在 x**********i 的大作中提到】
: 只知道一个整数数组的第一个元素的指针,怎么才能知道这个数组的大小?
: 这个题有解吗?谢谢大牛们不吝赐教了。

t****b
发帖数: 2484
4
别纠结这种i++ ++i 的问题了 安心刷一道算法题吧
x**********i
发帖数: 658
5
谢谢大牛回复。
比如我有一个整数数组,叫a,只知道&a, 能知道这个数组有多少个元素吗?不考虑new
那种情况。
刚才试了一下a=0xffffcbf0, a-1=0xffffcbec,差了4位,但是我的数组其实是有4个
elements。
更进一步,如果这个数组是在一个function中,跟这个数组在main中,有区别吗?
语言是c++,多谢。

【在 z*********n 的大作中提到】
:
: 你不说语言。。假设你说的是C++,
: 假设你说的动态数组(new 出来的)
: 那答案是“可能有”。取决于你的编译器,因为这是IB的。
: 不同编译器会把数组长度或者类似信息存在数组头指针前。为啥可能有呢,因为编译器
: 未必存的就是exactly的你的数组大小,可能考虑alignment,会多寸点。而且有的编译
: 器(我不知道哪个)也许不存这个信息,也是符合标准的。
: 如果是静态数组,如果你手里的那个是个真正的指针而非数组名,那应该就没戏了。因
: 为数组长度在编译时间存到了符号表里,运行时间不需要额外空间存储它,你也就拿不
: 到了。

x**********i
发帖数: 658
6
教育的是,抓紧刷题了。这是一个作业题,不知道怎么做,尴尬

【在 t****b 的大作中提到】
: 别纠结这种i++ ++i 的问题了 安心刷一道算法题吧
r*****s
发帖数: 1815
7
在函数里,没有static修饰的话是有区别的
如果在函数里,那么运行时是在栈里。。。你如果有更多信息的话(前面的变量地址)
可能
可以推断出这个数组的大小
这是在上15213么


: 谢谢大牛回复。

: 比如我有一个整数数组,叫a,只知道

【在 x**********i 的大作中提到】
: 教育的是,抓紧刷题了。这是一个作业题,不知道怎么做,尴尬
x**********i
发帖数: 658
8
谢谢指点,我再去想想

【在 r*****s 的大作中提到】
: 在函数里,没有static修饰的话是有区别的
: 如果在函数里,那么运行时是在栈里。。。你如果有更多信息的话(前面的变量地址)
: 可能
: 可以推断出这个数组的大小
: 这是在上15213么
:
:
: 谢谢大牛回复。
:
: 比如我有一个整数数组,叫a,只知道

z*********n
发帖数: 1451
9

new
你这问的是两码事。。
你手里有 &a,a是数组名对吧,比如int a[3],a是这么定义的吧?不是int *a = b(b是
一个数组,a是一个指针,指向b数组的某个元素),对吧?
如果你手里那个是&a,这不叫指向首元素的指针。。这叫指向数组的指针。。虽然他俩
值可能一样。
如果你有一个指向数组的指针,你当然可以直接用&a的地址减去 (&a-1)的地址来计算
数组长度了,这本质就是一个sizeof(a)。就跟int * p,对p来说,p和p-1的差值就是
一个sizeof(int)一样。
简而言之,如果你有&a,这么算就是数组大小:(int(&a) - int(&a-1)) / sizeof(int)
和main函数还是其他函数无关,main函数也就是一个特殊点的其他函数而已。

【在 x**********i 的大作中提到】
: 谢谢大牛回复。
: 比如我有一个整数数组,叫a,只知道&a, 能知道这个数组有多少个元素吗?不考虑new
: 那种情况。
: 刚才试了一下a=0xffffcbf0, a-1=0xffffcbec,差了4位,但是我的数组其实是有4个
: elements。
: 更进一步,如果这个数组是在一个function中,跟这个数组在main中,有区别吗?
: 语言是c++,多谢。

x**********i
发帖数: 658
10
我以为这两个总是一样的,因为&a==&a[0]啊。
int)
相关主题
google youtube interview, 莫名被拒。。。。。。C里的int和long有区别吗
再问一个C的malloc( )请问一下关于new和delete的概念
How to find the size of an array? Thanks.C/C++里数组作函数的参数的话应该怎么写?
进入JobHunting版参与讨论
z*********n
发帖数: 1451
11

不知道怎么给你解释。。
这俩值是是一样的,但这俩意义不一样,就跟一块内存里的数是0x0000,他可以是short
0,也可以是int 0,也可以是一个复杂的class,里面值为0.数一样,但这个数的类型
可未必一样。
&a是数组的地址,&a[0]是数组首元素地址,他俩值一样,但意义不一样。&a的类型是
指向数组的指针,&a[0]是指向数组元素的指针。
这么比喻一下吧,你们小组有10个人(int a[10]),每个人有自己的名字(地址),但
你们小组本身也得有个名字吧,方便起见,就以你们小组长的名字命名你们小组了。所
以你就会发现,&a(小组名)== &a[0] 小组长名,恒成立。
可以理解吧?继续看,&a[i]-1的意义是,告诉我你前一个组员的名字(地址)?
而&a-1的意义是,告诉我你前一个小组的名字(地址)?
所以当遇到需要考虑类型的运算时,&a和&a[0]就完全不同了。
而&a-1和&a之间就差一整个小组的空间,而&a[0]和&a[0]-1之间差一个组员的空间。
能理解了吧?

【在 x**********i 的大作中提到】
: 我以为这两个总是一样的,因为&a==&a[0]啊。
: int)

L*******t
发帖数: 782
12
以前学C语言时是说数组的名字等价于指向第一个元素的指针。也就是说 a == &a[0]
我刚实验了一下,a == &a == &a[0]。三个都一样。
#include
using namespace std;
int main() {
int a[10];
cout << "a = " << a << endl;
cout << "&a = " << &a << endl;
cout << "&a[0] = " << &a[0] << endl;
}
输出如下:
a = 0xffffcbe0
&a = 0xffffcbe0
&a[0] = 0xffffcbe0

short

【在 z*********n 的大作中提到】
:
: 不知道怎么给你解释。。
: 这俩值是是一样的,但这俩意义不一样,就跟一块内存里的数是0x0000,他可以是short
: 0,也可以是int 0,也可以是一个复杂的class,里面值为0.数一样,但这个数的类型
: 可未必一样。
: &a是数组的地址,&a[0]是数组首元素地址,他俩值一样,但意义不一样。&a的类型是
: 指向数组的指针,&a[0]是指向数组元素的指针。
: 这么比喻一下吧,你们小组有10个人(int a[10]),每个人有自己的名字(地址),但
: 你们小组本身也得有个名字吧,方便起见,就以你们小组长的名字命名你们小组了。所
: 以你就会发现,&a(小组名)== &a[0] 小组长名,恒成立。

l****u
发帖数: 1764
13
C和C++没法知道数组大小吧,你看leetcode上涉及数组的题目,传入的参数表里面都是
指针地址和数组size,因为C和C++里面没有lenth()的概念,那个sizeof是type的字节
数(比如int 4个字节,指针4个字节, short 2个字节),strenlen()也比较特殊,是
往后数到第一个\0的字节数
t**********n
发帖数: 1718
14
A.length
z*********n
发帖数: 1451
15

值当然一样,你不用实验也是显然的,你想说明什么问题?
值一样类型不一样啊。
你打印下&a - 1和&a[0] - 1看看一样不一样?
更显然的,int 0 和 char 0,这俩内存里的数值都是0,但类型不一样,使用起来天壤
之别。

【在 L*******t 的大作中提到】
: 以前学C语言时是说数组的名字等价于指向第一个元素的指针。也就是说 a == &a[0]
: 我刚实验了一下,a == &a == &a[0]。三个都一样。
: #include
: using namespace std;
: int main() {
: int a[10];
: cout << "a = " << a << endl;
: cout << "&a = " << &a << endl;
: cout << "&a[0] = " << &a[0] << endl;
: }

z*********n
发帖数: 1451
16

可以知道的啊,ls我的帖子里解释的够详细了吧。

【在 l****u 的大作中提到】
: C和C++没法知道数组大小吧,你看leetcode上涉及数组的题目,传入的参数表里面都是
: 指针地址和数组size,因为C和C++里面没有lenth()的概念,那个sizeof是type的字节
: 数(比如int 4个字节,指针4个字节, short 2个字节),strenlen()也比较特殊,是
: 往后数到第一个\0的字节数

l****u
发帖数: 1764
17
试了下,还有这种神奇的操作 受教了。不过这是静态数组吧,用一个指针指向这个数
组就不行了

【在 z*********n 的大作中提到】
:
: 可以知道的啊,ls我的帖子里解释的够详细了吧。

L*******t
发帖数: 782
18
我的意思是a == &a有点难理解,你写得是&a。
我再打印了几个。看起来a和&a[0]完全是一样的,连减一后都一样。&a减一就不一样了。
a = 0xffffcbd0
&a = 0xffffcbd0
&a[0] = 0xffffcbd0
a-1 = 0xffffcbcc
&a-1 = 0xffffcba8
&a[0]-1 = 0xffffcbcc

【在 z*********n 的大作中提到】
:
: 可以知道的啊,ls我的帖子里解释的够详细了吧。

x**********i
发帖数: 658
19
很详细了,收益匪浅,感谢

short

【在 z*********n 的大作中提到】
:
: 可以知道的啊,ls我的帖子里解释的够详细了吧。

x**********i
发帖数: 658
20
可以这样理解不,&a中,这里的a其实代表a[0],而&a-1中,这里的a就是整个数组了。
c++就是这样定义,没有为什么不为什么,对吗?

了。

【在 L*******t 的大作中提到】
: 我的意思是a == &a有点难理解,你写得是&a。
: 我再打印了几个。看起来a和&a[0]完全是一样的,连减一后都一样。&a减一就不一样了。
: a = 0xffffcbd0
: &a = 0xffffcbd0
: &a[0] = 0xffffcbd0
: a-1 = 0xffffcbcc
: &a-1 = 0xffffcba8
: &a[0]-1 = 0xffffcbcc

相关主题
二维数组问题狗家面经
急问offer选择请问以下程序运行结果
写写某银行面试题目我的bloomberg肯定没戏了,发点面试题攒人品吧
进入JobHunting版参与讨论
z*********n
发帖数: 1451
21

int * b = a。
然后呢?你如何从b里找到a的大小?
对于编译器来说,唯一含a大小的线索就是a本身。别的指针无法得知。

【在 l****u 的大作中提到】
: 试了下,还有这种神奇的操作 受教了。不过这是静态数组吧,用一个指针指向这个数
: 组就不行了

t*****n
发帖数: 2578
22
不要研究这种回字四种写法的问题了
对面试没帮助
刷题是正道
L*******t
发帖数: 782
23
补充一下:
a-1或者&a[0]-1,是hex(d0)-hex(cc) = 16-12 = 4。就是一个int的长度。
&a-1呢,是hex(d0)-hex(a8) = 16*3-8 = 40。是10个int的长度。我申明了一个10个
int的数组。
这样就和楼上的文字解释对上了。。耶

了。

【在 L*******t 的大作中提到】
: 我的意思是a == &a有点难理解,你写得是&a。
: 我再打印了几个。看起来a和&a[0]完全是一样的,连减一后都一样。&a减一就不一样了。
: a = 0xffffcbd0
: &a = 0xffffcbd0
: &a[0] = 0xffffcbd0
: a-1 = 0xffffcbcc
: &a-1 = 0xffffcba8
: &a[0]-1 = 0xffffcbcc

z*********n
发帖数: 1451
24

这么理解不完全对
先给你们补充几个基础知识吧:
int a[10];
意义:
a[0] 的类型是int
&a[0]的类型是int *
a 的类型是int[10],读作"10个int元素的数组"
&a 的类型是int (*)[10],读作“指向一个有10个int的数组的指针”
值:
a[0] 的值是a中第一个元素的值
&a[0]的值是a中第一个元素的地址
a 的值是a的地址,也等于a中第一个元素地址,规定。
&a 的值是数组a的地址,这个地址(记得我前面小组长的例子)碰巧是a[0]的地址。
所以你说a其实代表a[0]这个不对,这俩类型不一样,只是值碰巧一样。
a永远是这个叫做a的数组,不是只在&a-1中才是这个数组。
关于a-1:
a-1的类型是int *,因为数组名做减法无意义,隐式转化为int *后,减1.就跟你3/2.1
会自动升级成double类似。
另一个基本常识。
int * p
p和p-1之间地址差一个sizeof(int)
char *p
p和p-1之间地址差一个sizeof(char)
数组一样。
int (*p)[10] = &a;
p和p-1之间差一个sizeof(a).数组大小。

【在 x**********i 的大作中提到】
: 可以这样理解不,&a中,这里的a其实代表a[0],而&a-1中,这里的a就是整个数组了。
: c++就是这样定义,没有为什么不为什么,对吗?
:
: 了。

z*********n
发帖数: 1451
25

具体解释参看我ls回复。关键点是脑子里要清楚啥东西的类型是啥
a的类型是数组(不是指针,这俩不一样)
a-1的类型则是指针了。原因见上。

【在 L*******t 的大作中提到】
: 补充一下:
: a-1或者&a[0]-1,是hex(d0)-hex(cc) = 16-12 = 4。就是一个int的长度。
: &a-1呢,是hex(d0)-hex(a8) = 16*3-8 = 40。是10个int的长度。我申明了一个10个
: int的数组。
: 这样就和楼上的文字解释对上了。。耶
:
: 了。

i***c
发帖数: 26
26
why not vector ?!

new

【在 x**********i 的大作中提到】
: 谢谢大牛回复。
: 比如我有一个整数数组,叫a,只知道&a, 能知道这个数组有多少个元素吗?不考虑new
: 那种情况。
: 刚才试了一下a=0xffffcbf0, a-1=0xffffcbec,差了4位,但是我的数组其实是有4个
: elements。
: 更进一步,如果这个数组是在一个function中,跟这个数组在main中,有区别吗?
: 语言是c++,多谢。

x**********i
发帖数: 658
27
大牛这么耐心,循循善诱,小弟感激涕零

【在 z*********n 的大作中提到】
:
: 具体解释参看我ls回复。关键点是脑子里要清楚啥东西的类型是啥
: a的类型是数组(不是指针,这俩不一样)
: a-1的类型则是指针了。原因见上。

y**********u
发帖数: 2839
28
有空看看吧:
https://www.e-reading.club/bookreader.php/138815/Linden_-_Expert_C_
Programming:_Deep_C_Secrets.pdf
加油

【在 x**********i 的大作中提到】
: 大牛这么耐心,循循善诱,小弟感激涕零
x**********i
发帖数: 658
29
这是你的原话。也就是说a的类型是整数,但是它的值是一个地址?这不是自相矛盾吗?
这个算不算是c++定义中的一个bug?

【在 z*********n 的大作中提到】
:
: 具体解释参看我ls回复。关键点是脑子里要清楚啥东西的类型是啥
: a的类型是数组(不是指针,这俩不一样)
: a-1的类型则是指针了。原因见上。

z*********n
发帖数: 1451
30

吗?

我的原话是
a的类型是int[10],读作"10个int元素的数组"
怎么就变成a的类型是整数了?
int[10]怕你看不懂后面把读法都写出来。。还不清楚?

【在 x**********i 的大作中提到】
: 这是你的原话。也就是说a的类型是整数,但是它的值是一个地址?这不是自相矛盾吗?
: 这个算不算是c++定义中的一个bug?

相关主题
关于数组size的问题大家新年好。 请教一个 c interview question (转载)
这道题太神奇了,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),中国人面试果然很好人
Bloomberg London onsite面经砸了面试,发面题
进入JobHunting版参与讨论
x**********i
发帖数: 658
31
不好意思,我确实基础太差了,看书补课去了。再次感谢

【在 z*********n 的大作中提到】
:
: 吗?
: ?
: 我的原话是
: a的类型是int[10],读作"10个int元素的数组"
: 怎么就变成a的类型是整数了?
: int[10]怕你看不懂后面把读法都写出来。。还不清楚?

1 (共1页)
进入JobHunting版参与讨论
相关主题
请问以下程序运行结果[C++问题]请教关于几种size of class
我的bloomberg肯定没戏了,发点面试题攒人品吧google youtube interview, 莫名被拒。。。。。。
关于数组size的问题再问一个C的malloc( )
这道题太神奇了,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),How to find the size of an array? Thanks.
Bloomberg London onsite面经C里的int和long有区别吗
大家新年好。 请教一个 c interview question (转载)请问一下关于new和delete的概念
中国人面试果然很好人C/C++里数组作函数的参数的话应该怎么写?
砸了面试,发面题二维数组问题
相关话题的讨论汇总
话题: 数组话题: int话题: 指针话题: 一样话题: 地址