探索 C 语言的指针
指针的概念
指针代表一个变量的内存地址,通过&
可以拿到变量的内存地址。变量不等于指针,通过*
可以拿到指针所指向的变量的值。
在 C 中,存在指针变量,指针变量的声明格式:int* varName = &varAddress
。声明指针变量之后,通过*
可以拿到该指针变量所指向的值。例如,feet 变量是一个int
类型,指针变量的类型也是int
。
int main(void)
{
int feet = 10; // int 类型的变量
int* pfeet = &feet; // 指针变量,与 feet 数据类型一样
printf("before updating feet is %d\n", feet); // before updating feet is 10
*pfeet += 10; // 通过 * 拿到指针变量所指向的值
printf("now feet is %d\n", feet); // now feet is 20
return 0;
}
指针的作用
因为函数作用域的影响,局部变量只能存在于一个函数作用域内使用,一个函数传递它的局部变量给另一个函数,这个变量的地址会变化,也就是变量不是同一个。如果想“穿透”作用域带来的这种限制,考虑使用指针。
void change(int, int); // 声明一个函数
int main(void)
{
int x = 10, y = 5; // 声明 main 函数的局部变量
change(x, y); // 传递局部变量,main 函数的 x、y 和 change 的 x、y 地址不相同
printf("[3] x = %d, y = %d\n", x, y);
return 0;
}
void change(int x, int y)
{
printf("[1] x = %d, y = %d\n", x, y);
x = 20;
y = 10;
printf("[2] x = %d, y = %d\n", x, y);
}
在 main 函数中声明的两个局部变量,change 函数的变量由 main 传递,但实际上 x 和 y 的地址都不一样。main 函数修改 x 或 y,不会影响 change 函数内的 x 或 y。而传递指针,就能够穿透“作用域”,改变上述问题。
指针指向的是内存地址,只要拿到内存地址,找到门牌号,就能修改变量的值。下面通过指针来修改 main 函数的 x 和 y:
void change(int*, int*); // 声明指针变量,传递变量的内存地址
int main(void)
{
int x = 10, y = 5;
change(&x, &y); // 传递内存地址,而不是变量
printf("[3] x = %d, y = %d. x Address = %p, y Address = %p\n", x, y, &x, &y);
return 0;
}
void change(int* x, int* y)
{
printf("[1] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
*x = 20;
*y = 10;
printf("[2] x = %d, y = %d. x Address = %p, y Address = %p\n", *x, *y, x, y);
}
change 函数接收的是一个指针,函数找到内存地址所对应的变量(通过*
拿到内存所指向的变量值),修改其指针所指向的变量值,main 函数的 x 和 y 也随着改变: