前面教程汇总
第一讲
第二讲
第三讲
第四讲
第五讲
指针
注:本文中的所有内容均同时适用于C++和C语言。
前言
指针其实很简单。同C语言和C++中其他变量一样,把指针也看成是一种变量即可,这种变量专门存储地址值。
int a = 100;
int* b = &a;
上面的代码很清晰,a
是一个整形变量,值为 100
;b
是一个指针变量,值是变量 a
的地址。变量和指针的类型必须相同。
本文主要讲利用指针变量如何读写地址中的值。
正文
一
首先来假设一个场景:交换 a
和 b
两个变量的值。看下面的例子:
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(a, b);
}
结果 a
,b
的值并没有交换成功。原因是:C和C++的程序在调用函数时使用“按值调用”,这意味着变量的值直接从调用函数复制到被调函数的实参中,“按值调用”是C语言和C++中调用函数的唯一方式。
二
C和C++通过创建指针的方式解决上述问题。
尽管声明指针变量的形式稍微复杂一点点,指针就是个保存变量地址的变量而已。指针常见操作如下:
第一类:创建指针变量,“ 基本类型 + * ”。
int* iptr;
char* cptr;
double* dptr;
第二类:给指针变量赋值,“ & + 变量 ”。
int a = 100;
char b = 'o';
double c = 100.5;
int* iptr;
char* cptr;
double* dptr;
iptr = &a;
cptr = &b;
dptr = &c;
第三类:取指针变量保存的地址中的值,“ * + 指针变量”。
int a = 100;
int* iptr = &a;
int b = *iptr;
于是,上面的代码改写成:
void swap(int* x, int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
void change()
{
int a = 100;
int b = 200;
swap(&a, &b);
}
三
一个函数只能访问自己的栈帧。
但是,通过指针,一个函数可以间接地读写另一个栈帧中的变量值。
值得注意的是,函数之间利用指针读写是有方向的。如果函数 F1
调用 F2
,则 F2
可以读写 F1
中的变量值,反之不行。很好理解,F2
得栈帧先出栈,出栈后变量都没有了,F1
还读写什么呢?