初学者问题-为什么C使用*来声明指针而不是&;?
那么让我们说:初学者问题-为什么C使用*来声明指针而不是&;?,c,cs50,C,Cs50,那么让我们说: int n = 50; int *p = &n; 为什么我们在C中使用*而不是&?*和&之间的主要区别是什么?在C*中,变量定义的意思是“指针指向”。在表达式中,&运算符表示“的地址”,而*运算符表示“取消引用” 因此,实际上: int n = 1; int* p = &n; // Create a pointer and initialize with the address of n if (*p == 1) { // This is true whe
int n = 50;
int *p = &n;
为什么我们在C中使用
*
而不是&
?*
和&
之间的主要区别是什么?在C*
中,变量定义的意思是“指针指向”。在表达式中,&
运算符表示“的地址”,而*
运算符表示“取消引用”
因此,实际上:
int n = 1;
int* p = &n; // Create a pointer and initialize with the address of n
if (*p == 1) {
// This is true when dereferencing the pointer
}
为什么不像在int&p
中那样使用&
?主要是因为语法不是这样设置的
值得注意的是,在C++中,<代码>和<代码>返回为“引用”:
注意,在右边不需要任何特殊处理,它只需要计算出来。使用
*
声明指针基本上是惯例问题,但有一个一致性原因:声明int*p
中的*
表示int
是*p
的类型
当p
被初始化为n
的地址时,编写int&p=&n
似乎更为一致,但这种约定不适用于双指针:int**pp
将pp
定义为指向int
的指针,但pp
不能用&&n初始化
注意
int&p=n代码>是C++中的一个有效的定义,用于引用<代码> int >代码>,这是一个伪装的指针。修改p
将修改n
。引用是作为指针实现的,没有间接表示法。C声明遵循一种通常被称为“声明模仿使用”的约定。声明的结构与代码中表达式的结构匹配(尽可能接近)
例如,假设您有一个指向名为p
的int
的指针。为了访问存储在指向对象中的值,我们使用一元*
运算符取消对指针的引用,如下所示:
printf( "value of what p points to is %d\n", *p );
表达式*p
的类型为int
,因此我们将p
声明为
int *p;
这表示变量p
的类型为“指针指向int
”,因为声明符中p
和解引用运算符*
的组合会产生int
类型的表达式
这就是为什么在C中不使用&
操作符声明指针的主要原因,因为表达式&p
的类型不是int
C++使用一元&
运算符声明引用,这与指针不同:
void foo( int &ref )
{
ref = new_value(); // writes a new value to the actual parameter ref references
}
int main( void )
{
int x = 1;
std::cout << "x before foo = " << x << std::endl;
foo( x );
std::cout << "x after foo = " << x << std::endl;
return 0;
}
这很重要-没有“指针指向”类型说明符。pointerness由声明器指定。如果你写的是
int* a, b;
它将被解析为
int (*a), b;
并且只有a
将被声明为指针 “*”用于表示指针类型,因为这是语法。不需要其他理由。一元*运算符(与类型声明不同,无论是否使用相同的符号)是指针解引用,&一元运算符是address-of。为什么?因为语言语法是这样的,这就是为什么。你所展示的p
声明(int*p
)意味着p是指向int
的指针,我把它读作“int pointer p”,而int*p
中的*
至少对我来说意味着“指针”。YMMV。@BobJarvis,莫妮卡:有趣的评论。我通常不会大声朗读代码,我可能会读int star p,或者在教授法国程序员intéTOLE p时。你的发音更合理,也不容易混淆。您将如何发音char*argv[]
?我将其发音为“char(发音为‘care’-我的代码不会冒烟:-)指针数组argv”,或者可能是“char指针数组argv”。谢谢!这就是语法和惯例的问题?我在学习,所以我想确定…这就是C是如何被定义的。
int* a, b;
int (*a), b;