如图,该变量 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