我有一个代码,其中有以下工作:
//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返回,但它们并不总是如此!
答案 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