C语言中的*和&作用
转载:https://blog.csdn.net/qq_21583681/article/details/78572009
简单来说:
- *p好像表示的是一个指针;
- &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表示另一个存储单元中的数据。
- 当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;
- 通过*a可以访问(读取或修改)这个数值。a == &*a 都是该存储单元的地址。
- 当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。
在C语言里地址叫指针。还有,在C语言中的数组本质上其实也是指针,即:*a 等同于 a[]。