C语言中的指针-定义和引用指针变量-学习笔记-24

指针变量

前面我们说,存放地址的变量,称为指针变量,那么我们该如何定义和使用指针变量呢?

使用指针变量

我们先从一个例子引入:
问题:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,找到他们所指向的变量,从而获得这些变量的信息。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
int a=1,b=2; //定义了两个整型变量
int * a_pointer , * b_pointer; // 声明了两个指针变量,没有定义
a_pointer=&a; // 将变量 a 的地址传给 a_pointer
b_pointer=&b; //将变量 b 的地址传给 b_pointer
printf("a=%d,b=%d\n",a,b);
printf("a_pointer=%d,b_pointer=%d\n",* a_pointer,* b_pointer);
return 0;
}

我们可以看到,输出的时候,其结果是相同的,因为 a_pointer 和 b_pointer 有了 a 和 b 的地址,前面加上*号之后,就代表了该地址所指向的数据内容。

*号表示指向,* a_pointer 表示的是指向指针变量 a_pointer 所指向的变量。

上面的例子中,有* a_pointera_pointer,我们来具体说一下:

  1. 开头声明变量时,前面加*号,是为了告诉编译器,这是指针变量。
  2. 中间赋值时,没有加*号,因为我们单纯的将其当做变量来使用,进行赋值和定义。
  3. 最后输出时,加*号表示的不在是一个指针变量了,而是代表着这个指针变量所指向的数据,也就是 a 的值。

定义指针变量

看了上面的例子,我们来总结一下如何定义一个指针变量

类型名 * 指针变量名;

前面的类型名是必须指定的基类型,也就是指针变量是什么类型,其所指向的数据必须为什么类型。也就是说基类型为整型的指针变量,无法指向浮点型变量。
跟定义其他变量相同,我们也可以在定义时同时对其进行初始化:

1
2
int a=1;b=2;
int * a_pointer=&a, * b_pointer=&b;

注意

  1. a_pointer 和 a_pointer 不是同一种东西,在获得变量地址的时候,是 a_pointer,因为这是一个变量,可以用等号进行赋值。 a_pointer 则表示的是 a_pointer 存储的地址所指向的值。
  2. 必须要指定指针变量的基类型,因为不同变量的存储单元的长度是不同的,如果我们不指定基类型,那么编译器就不知道要分配给当前的指针变量多大的长度。
  3. 指针变量里面只能存放地址,不能把一个整数存放进指针变量中。

特别注意
一个指针变量包含两个部分:
a_pointer 表示的是一个指针变量,变量存的是地址
a_pointer 表示的是地址所指向的数据
`赋值的时候用 a_pointer ,使用的时候用
a_pointer 。`

描述指针变量

我们在描述指针变量时,不能单纯的说 a 是一个指针变量,而应该说,a 是一个指向 XXX 的指针变量。
在描述指针变量类型的时候,也应该说,这是一个指向 int 的指针。
#

引用指针变量

引用指针变量时,有 3 种情况:

  1. 给指针变量赋值。
  2. 引用指针变量指向的变量。
  3. 引用指针变量的值。
1
2
3
a_pointer = &a;  //给指针变量赋值,获得地址。
printf("%d", *a_pointer); //使用指针变量所指向的变量,根据地址输出 a 的值
printf("%o", a_pointer); //输出指针变量的地址,也就是输出获得的 a 的地址。

有两个重要的运算符需要搞清楚:
1、&表示的是取地址算符,&a 表示变量 a 的地址。
2、*表示的是指针运算符,*a 表示的是指针变量 a 所指向的对象。

应用例子

交换两个变量的值:

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main(){
int a=1,b=2,c;
printf("交换前a=%d,b=%d\n",a,b);
c=a;
a=b;
b=c;
printf("交换后a=%d,b=%d\n",a,b);
}

交换前a=1,b=2
交换后a=2,b=1
Program ended with exit code: 0

上面的变量值交换需要引入第三个变量 c 进行中转,使用指针后,我们就可以省略中间变量 c。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main(){
int a=1,b=2;
int *a_pointer=&a, *b_pointer=&b;
printf("交换前a=%d,b=%d\n",a,b);
a_pointer = &b;
b_pointer = &a;
printf("交换后a_pointer=%d, b_pointer=%d\n",*a_pointer,*b_pointer);
printf("交换前a=%d,b=%d\n",a,b);
}

交换前a=1,b=2
交换后a_pointer=2, b_pointer=1
交换前a=1,b=2

我们可以看到因为我们把 a 和 b 的地址交换了,所以a 和 b 的指针指向的内容也叫换了,所以输出的内容,但是 a 和 b 的实际的值并没有改变,只不过是输出的指针所指向的地址变化了而已。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!