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;