指针变量
前面我们说,存放地址的变量,称为指针变量,那么我们该如何定义和使用指针变量呢?
使用指针变量
我们先从一个例子引入:
问题:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,找到他们所指向的变量,从而获得这些变量的信息。
1 |
|
我们可以看到,输出的时候,其结果是相同的,因为 a_pointer 和 b_pointer 有了 a 和 b 的地址,前面加上*号之后,就代表了该地址所指向的数据内容。
*号
表示指向
,* a_pointer 表示的是指向指针变量 a_pointer 所指向的变量。
上面的例子中,有* a_pointer
和a_pointer
,我们来具体说一下:
- 开头声明变量时,前面加
*号
,是为了告诉编译器,这是指针变量。 - 中间赋值时,没有加
*号
,因为我们单纯的将其当做变量
来使用,进行赋值和定义。 - 最后输出时,加
*号
表示的不在是一个指针变量了,而是代表着这个指针变量所指向的数据
,也就是 a 的值。
定义指针变量
看了上面的例子,我们来总结一下如何定义一个指针变量
类型名 * 指针变量名;
前面的类型名是必须指定的基类型
,也就是指针变量是什么类型,其所指向的数据必须为什么类型。也就是说基类型为整型的指针变量,无法指向浮点型变量。
跟定义其他变量相同,我们也可以在定义时同时对其进行初始化:
1 | int a=1;b=2; |
注意
- a_pointer 和 a_pointer 不是同一种东西,在获得变量地址的时候,是 a_pointer,因为这是一个变量,可以用等号进行赋值。 a_pointer 则表示的是 a_pointer 存储的地址所指向的值。
- 必须要指定指针变量的
基类型
,因为不同变量的存储单元的长度是不同的,如果我们不指定基类型,那么编译器就不知道要分配给当前的指针变量多大的长度。 - 指针变量里面只能存放地址,不能把一个整数存放进指针变量中。
特别注意
一个指针变量包含两个部分:
a_pointer 表示的是一个指针变量,变量存的是地址
a_pointer 表示的是地址所指向的数据
`赋值的时候用 a_pointer ,使用的时候用a_pointer 。`
描述指针变量
我们在描述指针变量时,不能单纯的说 a 是一个指针变量,而应该说,a 是一个指向 XXX 的指针变量。
在描述指针变量类型的时候,也应该说,这是一个指向 int 的指针。
#
引用指针变量
引用指针变量时,有 3 种情况:
- 给指针变量赋值。
- 引用指针变量指向的变量。
- 引用指针变量的值。
1 | a_pointer = &a; //给指针变量赋值,获得地址。 |
有两个重要的运算符需要搞清楚:
1、&
表示的是取地址算符,&a 表示变量 a 的地址。
2、*
表示的是指针运算符,*a 表示的是指针变量 a 所指向的对象。
应用例子
交换两个变量的值:1
2
3
4
5
6
7
8
9
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 |
|
交换前a=1,b=2
交换后a_pointer=2, b_pointer=1
交换前a=1,b=2
我们可以看到因为我们把 a 和 b 的地址交换了,所以a 和 b 的指针指向的内容也叫换了,所以输出的内容,但是 a 和 b 的实际的值并没有改变,只不过是输出的指针所指向的地址变化了而已。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。