【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。

时间:2022-12-08 11:02:14

???? * 和 & 认识

假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a​&*pa​分别是什么意思呢?

*&a可以理解为*(&a)&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a

&*pa可以理解为&(*pa)*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa


???? 对解引用(*)认识

表示乘法,例如 int a = 3, b = 5, c;  c = a * b; ​这是最容易理解的。

表示定义一个指针变量,以和普通变量区分开,例如int a = 100;  int *p = &a;

表示获取指针指向的数据,是一种间接操作,例如 int a, b, *p = &a; *p = 100; b = *p;

表示获取指针指向的数据,是一种间接操作。这里我来举出一个代码例子↓

#include<stdio.h>
int main(void)
{
int a = 10;
int *p = &a;
printf(" a = %d\n", a);
printf("*p = %d\n", *p);
printf("a = %p *p = %p &p = %p p = %p\n", a,*p,&p,p);
//注意:解引用改变p,同时也会改变指向a的地址(同样改变a的值同样p也会跟着改变)
a = 20;
printf(" a = %d\n", a);
printf("*p = %d\n", *p);
*p = 50;
printf(" a = %d\n", a);
printf("*p = %d\n", *p);
int b = *p;
printf(" b = %d", b);
return 0;
}

【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。

运行结果????

这里大家可以好好思考下为什么,为什么运行结果是这样看看能不能说出来。这样你才能真正的掌握这些知识点。

【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。


???? " * & 的应用" 

如下所示????

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int i = 0;
int* p = &i;
printf("请输入数字:");
scanf("%d", &i);
printf("numbers1 = %d\n", *&i);
printf("numbers1 = %d\n", i);
printf("numbers1 = %d\n", *p);

return 0;
}

【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。

运行结果

三个 printf() 打印的值都是一样的(同样可以思考下这个是为什么)


???? 通过指针交换变量值 

既然都看到这里了,那么我们就来尝试做一道题目吧,看看你是否掌握这些知识点了。

题目内容:用指针交换两个值。

#include <stdio.h>
void swap(int *pa, int *pb)
{
int temp = *pa; //10
*pa = *pb; //20
*pb = temp; //10
}
int main(void)
{
int a = 10, b = 20;
int *pa = &a, *pb = &b;
printf("交换前的值:a=%d, b=%d\n", a, b);

swap(pa,pb);
printf("交换后的值:a=%d, b=%d\n", a, b);
return 0;
}

【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。

运行结果????

交换前的值:a = 10, b = 20

交换后的值:a = 20, b = 10

对程序进行说明如下↓

swap()是用户定义的函数,它的作用是交换两个变量(a 和 b)的值。swap 函数的形参 papb 是指针变量。程序运行时,先执行 main 函数,已知 a 和 b 的值。然后将 a 和 b的地址分别赋给指针变量 pa pb使 pa 指向 a,pb 指向 b

用图形表示如下如下↓

【C语言】* 和 & 认识、对解引用(*)认识、* & 的应用、通过指针交换变量值、指针变量的说明。


???? 指针变量的说明 

指针变量可以进行某些运算,但其运算的种类是有限的。它只能进行赋值运算和部分算术运算符以及关系运算

指针运算符如下↓

  1. 取地址运算符&: 取地址运算符&单目运算符,其结合性为自右至左,其功能是取变量 的地址。
  2. 取内容运算符*: 取内容运算符*单目运算符,其结合性为自右至左,用来表示指针变 量所指的变量。在*运算符之后跟的变量必须是指针变量。

需要注意的是指针运算符* 和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,“*”是类型说明符,表示其后的变量是指针类型。而表达式中出现的“*”则是一个运算符用以表示指针变量所指的变量