
如图,该变量 i 占有第 2000 和第 2001 两个字节,其中第 2000 字节是变量的地址。
- 指针就是地址,指针变量存储地址
11.1.1~11.1.2 取地址符和间接寻址符
&:取地址符:获取地址的*:间接寻址符:获取该地址对应存储空间的内容(值,对象)
#include <stdio.h>// int *p; 是声明一个指针变量,也就是给这个变量开辟一个存储空间// (int *)p// *p; 是取 p 这个指针的值// p; 存储的就是地址,和 &x 一样int main(){int x = 10;int *p = &x;printf("x 的地址:%d(用取地址符表示),\nx 的地址:%d(用指针表示),\nx 的值(对象):%d\n",&x,p,*p);printf("说明 &x 等价于 p");}// 输出x 的地址:6684180(用取地址符表示),x 的地址:6684180(用指针表示),x 的值(对象):10说明 &x 等价于 p
你可以把 * 和 & 理解为两个互逆的操作
#include <stdio.h>int main(){int i=10;int p = *&i;printf("%d",p);}// 输出10
改变指针的值,也会改变指针所指对象的值
#include <stdio.h>int main(){int i=10;int *p = &i;*p = 11;printf("*p = %d,i = %d",*p,i);}// 输出*p = 11,i = 11
11.3 指针赋值
前提是两个指针具有相同的类型
#include <stdio.h>int main(){int i = 10;int *p = &i;int *q;q = p;printf("i = %d\n *p = %d\n *q = %d\n",i,*p,*q);}// 输出i = 10*p = 10*q = 10
note
- p = q 和 p = q 是不同的
11.4 指针作为实际参数
C 语言中的参数传递
- 值传递(变量传递):传递的是副本,即在子函数中对变量的修改,不影响主函数中的变量的值
- 地址传递:传递的是实际的变量地址,一处改动,处处变化
先来看用变量作为参数传递
#include <stdio.h>void changeNumber(int i);int main(){int i;i=10;changeNumber(i);printf("在主函数中的 i =%d\n",i);return 0;}void changeNumber(int i){i = i+1;printf("在子函数里面的 i = %d\n",i);}// 输出在子函数里面的 i = 11在主函数中的 i =10
地址传递
#include <stdio.h>void changeNumber(int *i);int main(){int i;i=10;changeNumber(&i);printf("在主函数中的 i =%d\n",i);return 0;}void changeNumber(int *i){*i = *i+1;printf("在子函数里面的 i = %d\n",*i);}// 输出在子函数里面的 i = 11在主函数中的 i =11
11.5 指针作为返回值
#include <stdio.h>int *comMax(int *p,int *q);int main(){int i = 10;int j = 20;int *p = &i;int *q = &j;int *ans = comMax(p,q);printf("最大值的地址:%d,最大值是:%d",ans,*ans);return 0;}int *comMax(int *p,int *q){if(*p>*q)return p;else if(*p<*q)return q;}// 输出最大值的地址:6684160,最大值是:20
