int * ptr =& var和int * ptr之间的区别; * ptr =& var?

时间:2016-12-26 10:48:17

标签: c++ arrays pointers

我有一个代码,其中有以下工作:

//code 1
int* p0 = &v0;
int* p1 = &v1;
.
.
.
int* pn = &vn;

但以下情况并非如此:

//code 2
int *p0, *p1, ...,*pn;
*p0 = &v0;
*p1 = &v1;
.
.
.
*pn = &vn;

为什么不呢?什么是重现代码1结果的正确方法,同时仍然在代码2中首先声明指针?

我需要第二种类型,因为我想将这些*pi (i = 1 to n)转换为数组*p[i],我想要这样的内容:

//code 3
int *p[n];
*p[0] = &v1;
*p[1] = &v2;
.
.
.
*p[n] = &vn;

出于某种原因,现在,我不想将“vi”转换为数组。

编辑:

根据我收到的答案进行编辑:

数组方法似乎不起作用!适合我的原始代码是:

int* p0 = &v0[0];  
int *p1 = &v0[1];
... 

int* q0 = &v1[0];
int *q1 = &v2[1]; 
... 

main我有

const bool cond1 = *p1 > 2; 
const bool cond2 *p2 > 3; 
...

等,它工作正常。所以基于答案,我尝试了这个:

int* p[n], q[n],...;
int v[n][m];

然后

p[0] = &v[0][0];
p[1] = &v[0][1];
....`  


q[0] = &v[1][0];
q[1] =&v[2][0];
...

此代码不起作用。它将所有那些布尔条件作为fall返回,但它们并不总是如此!

2 个答案:

答案 0 :(得分:5)

重现第一个代码示例结果的正确方法如下:

int *p0, *p1, ...,*pn;
p0 = &v0;
p1 = &v1;
.
.
.
pn = &vn;

或者您的数组示例:

int *p[n];
p[0] = &v1;
p[1] = &v2;
.
.
.
p[n] = &vn; 

定义中的星号将变量类型指定为指针。在其他上下文中,它尝试取消引用指针,产生对int的引用,如果没有强制转换,则无法为其分配地址。

您还应该考虑将数组定义与其初始化合并:

int *p[n] = {
  &v1,
  &v2,
  .
  .
  .
  &vn
};

答案 1 :(得分:0)

您似乎对*符号的两个不同使用感到困惑,这些符号在您正在执行的操作的上下文中具有两个不同的含义。< / p>

首先修改变量的类型以使其成为指针类型,然后再访问指针所指向的值。

当您声明变量时,*属于类型(无论您将其放置在何处)。

所以:

int* p0; // p0 is of type "int pointer"

由于p0指针类型,因此您不需要做任何想要指向地址的事情:

p0 = &v0;

如果您希望取消引用指针以获取它所指向的,那么您只会做一些奇特的事情。

*p0 = 5; // dereference p0 to get to the int

这是*不同用法。在它用于提供类型信息之前,现在它用于取消引用指针。因此,因为它取消引用变量,所以它在语义上应用于变量*p0

因此,当将变量声明为指针时,*在语义上应用于类型

int* p0; // * is part of the type

当访问(解除引用)指针以获取其目标值时,*将应用于变量:

*p0 = 5;

语言语法允许将*放置在类型变量之间的任何位置< EM>声明:

int *p0; // also legal but * still semantically applies to the type