【问题标题】:Array name as pointer and array name with & operator [duplicate]数组名称作为指针和数组名称与 & 运算符 [重复]
【发布时间】:2013-04-30 21:54:21
【问题描述】:

最后两条语句有什么区别:

int a[20];
int *b=a;
int *c=&a;

我认为两者是相同的,但在最近的一次采访中,面试官很想知道我不知道的区别。

有人可以详细解释一下吗?

我去了这篇文章,但不了解数组相关部分: Function pointers and address of a function

【问题讨论】:

  • 重复数百次。
  • 抱歉 - 该链接不太正确。但是,如果您搜索,您会发现许多相同问题的示例。
  • 谢天谢地,有些人被雇用来淘汰那些不准备研究、阅读手册的潜在员工,你知道...... Jobby 的东西!如果你想要这份工作,你会找到这个问题的答案,并通过阅读一本书来预测可能出现的关于该语言的任何其他问题,同时思考“我可以从这句话中说出哪个问题?”。这个建议可能看起来很苛刻,但很现实:设身处地为面试官着想,在面试之前学习该死的语言,这样你就不会再浪费你的时间了(或其他人的时间)。
  • ...如果您不想做任何这些事情,那么您显然不想要这份工作。找点别的事做。再一次,这很苛刻……但它是现实的。做一份你不喜欢的工作不会让你开心,所以找一份你喜欢的工作,做一个快乐的露营者!如果你确实想要这份工作,你应该能够向面试官表明你热爱所涉及的工作。吹嘘你的研究技能,这样他们就不必问了。

标签: c arrays pointers


【解决方案1】:
int a[20];

您正在声明一个数组a,它可以容纳20 int

int *b=a;

由于a 是一个数组,a 的计算结果为数组a 的基地址(即a 的第一个元素)。所以b 是一个int 指针,它指向数组a 中的第一个元素

int *c=&a;

&a 表示分配给int 指针ca 的地址。但是,这不好,因为&a 是数组的地址(不是数组的基地址),所以你应该将c 定义为int **(即指向指针的指针)或将其分配给&a[0] (即数组a 的第一个元素的地址)。由于数组被分配了连续的内存,一旦你有了数组的基地址,你可以通过*(b+i)轻松访问数组的剩余元素,其中i是你想要访问的元素的索引。

然而,

int a = 5;
int *b= a ; // WRONG -- b will not point to the address of variable a,  but to the memory location 5, which is what you do not want
int *c = &a; //CORRECT

【讨论】:

  • 谢谢比尔,我明白了。我想在这里了解 b=a 和 c=&a 之间的区别(即 a 和 &a)。
  • 答案中提到了....a 计算为数组的基地址(声明为数组时),但是当它是变量时,它的计算值为变量,而不是地址。但是,&a 始终计算为a 的地址。希望这可以澄清它。
  • b 指向a 的第一个元素。 OP 代码中的int *c=&a; 是错误的,因为&a 的类型为int (*)[20],并且是指向数组的指针。将其分配给 int * 是分配给不兼容的指针类型。
猜你喜欢
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2013-07-04
  • 2020-02-15
  • 2013-06-07
相关资源
最近更新 更多