C++ 理解CPP指针

C++ 理解CPP指针,c++,pointers,integer,C++,Pointers,Integer,如果 那么下面的陈述有什么不同呢?这两份声明不会把电话号码的地址抄送给汤米吗 int number[]; int *tommy; 或 编辑:对不起,伙计们,我指的是int数组,而不仅仅是int。第一个将number的地址分配给tommy。第二个尝试将数字number分配到指针tommy,它应该无法编译 编辑 对于编辑,情况正好相反:第一个不应该编译。int数组的地址类型为int(*)[size],无法转换为int*第一次赋值是正确的-它将编号的地址分配给指针tommy 第二个赋值将number

如果

那么下面的陈述有什么不同呢?这两份声明不会把电话号码的地址抄送给汤米吗

int number[];
int *tommy;


编辑:对不起,伙计们,我指的是int数组,而不仅仅是int。

第一个将
number
的地址分配给
tommy
。第二个尝试将数字
number
分配到指针
tommy
,它应该无法编译

编辑


对于编辑,情况正好相反:第一个不应该编译。int数组的地址类型为
int(*)[size]
,无法转换为
int*

第一次赋值是正确的-它将
编号的地址分配给指针
tommy


第二个赋值将
number
的值赋值给指针
tommy

不,它们不会,
&
参考运算符
的地址
它将获取预先附加的变量的地址,因此这就是您想要的:

tommy = number;
当您只使用普通的
number
时,它只返回存储在number中的整数值,而number不会编译。关于指针的这篇文章涉及到更多的细节

更新:

因此,在对问题进行编辑后,如果没有大小,将无法编译:

tommy = &number
这是有效的:

int number[];
现在它被颠倒了,这是有效的,并且将编译:

int number[10];
第二行尝试将整数数组视为单个整数,编译器将不允许这样做,因此它无效:

tommy = number ;

不,两者根本不同。表达式
&number
的计算结果是存储
number
值的地址,而表达式
number
的计算结果直接是值本身

假设number的值是42,它存储在内存中的地址1024处。内存是线性的*,所以它看起来像这样:

tommey = &number ;
现在,语句
tommy=&number
将把值1024分配给
tommy
,因为
&number==1024
number
的地址

另一条语句,只要它编译过,就会将(无意义的)值42(编号的值)赋给
tommy
。任何试图取消引用(访问tommy所指向的数据)的尝试都可能产生分段错误,因为42(可能)不是有效地址


*至少,操作系统会让你产生地址空间是线性和连续的错觉。

int number定义整数
数字
<代码>整数*汤米
tommy
定义为指向整数的指针

tommy=&number
编号
的地址分配给
汤米
<代码>*tommy
将给出实际数字

tommy=number
tommy
中存储
number
的值。首先,应该有一个编译错误,最重要的是,如果您成功地将
number
存储到
tommy
中,那么
*tommy
将尝试从一个地址与
number
内容相同的无效位置执行,并导致分段错误

Postscript

我想如果你看到这样的例子

+--------+ Address 0
| ...... |
+--------+
|   42   | Address 1024 (value is stored here)
+--------+
| ...... |
+--------+ Address xxxx

在本例中,
a
是数组的名称,相当于数组的地址或数组的第一个元素,即
&a[0]
。因此,将
a
存储到
tommy
中是有效的

对于要编译的示例,数组需要一个大小:

int a[10];
int *tommy;

tommy = a; // This will work
因为您无法创建大小未知的变量

int number[1];
这不应该编译
&number
是指向数组的指针,它不能转换为指向
int
的指针,因此不能指定给该类型的变量

tommy = &number;

error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment

这很好。在表达式中使用时,可以将数组转换为指向其第一个元素的指针。该指针类型为
int*
,与
tommy
相同,因此允许进行赋值。

第二个指针类型不会编译。要学习类似的基本知识,您可能需要学习一个。回答此问题的每个人似乎都忽略了
number
是一个数组。第二个编译,第一个是类型错误。@john:那是因为直到一分钟前它还不是数组。现在它是一个大小未知的数组,所以它仍然无法编译。@Firdous有几个在线编译器可用,例如…感谢您正确解释,那么tommy=a和tommy=&a会相似吗?是的
a
,数组的名称将与数组的地址
&a
相同,并且也是数组的第一个元素
&a[0]
tommy = &number;

error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment
tommy = number;