C语言中的*和&作用

转载:https://blog.csdn.net/qq_21583681/article/details/78572009

简单来说:

  1. *p好像表示的是一个指针;
  2. &p表示的是一个地址。

例如:

int a = 10;      定义整形变量a,并将10赋值给a
int *b = &a;    &a: 获取a变量对应的地址,*b: 获取指针指向的变量值

printf(“%d\n”, a);     输出:10
printf(“%d\n”, &a);  输出:6487620(即a在内存中所在的地址)
printf(“%d\n”, b);    输出:6487620(即&a对应的地址)
printf(“%d\n”, *b);  输出:10(即&a对应的地址对应的值)

总结:

  • a表示a对应的存储单元中的数据。
  • &a表示a对应的存储单元的地址。
  • *a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。


变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。

所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。
a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。

 

C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。

*a表示另一个存储单元中的数据。

  1. 当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;
  2. 通过*a可以访问(读取或修改)这个数值。a == &*a 都是该存储单元的地址。
  3. 当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。

在C语言里地址叫指针。还有,在C语言中的数组本质上其实也是指针,即:*a 等同于 a[]。

posted @ 2022-05-24 20:02  JRS077  阅读(2106)  评论(0编辑  收藏  举报