指针是C语言中非常重要的一个数据概念,会玩指针才是真的入了C语言的大门。
我们在使用变量的时候直接使用变量名来获取变量的值,这是直接引用,但是程序内部可并没有这么简单,而是声明变量时先给变量分配一个地址,在读取的时候读的是这个地址所存储的二进制数,然后转换成我们要的值。
那什么是指针呢?我们已经知道读取变量使用的是直接引用,那相对的肯定存在间接引用,指针就是间接引用,是吧变量对应的地址作为值赋给指针,在修改或者使用的时候先去除指针的值,也就是变量的地址,然后根据这个地址修改对应地址的值,如图:
总结:用来存放变量地址的变量,就称为"指针变量"。在上面的情况下,变量b就是个"指针变量",我们可以说指针变量b指向变量a。
指针的定义
int a = 100; float b = 100.0; //先定义,后初始化 int *c; c = &a; //把a的地址赋值给c //定义的同时初始化 float *d = &b; //但是不能直接给指针变量赋值,比如 int *a;a = 200;
"*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分,前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。
通过指针赋值
int a = 10; printf("赋值之前a的值为%d\n",a ); int *b = &a; *b = 100; printf("赋值之后a的值为%d\n",a ); // a其实也就是*b对应的值,而b的值是a的地址&a
指针使用案例
void swap(int a, int b){ printf("更换前:a=%d, b=%d\n", a, b); int tem = a; a = b; b = tem; printf("更换后:a=%d, b=%d\n", a, b); } int int main(int argc, char const *argv[]){ int x = 10, y = 9; printf("更换前:x=%d, y=%d\n", x, y); swap(x, y); printf("更换后:x=%d, y=%d", x, y); return 0; }
程序运行打印结果可知,a、b的值变了,但是x、y的值却没有变化,那这里我们就需要使用指针来修改程序了,只需把swap函数变为下面这样就可以了
void swap(int *a, int *b) { // 中间变量 int temp; // 取出v1指向的变量的值 temp = *a; // 取出v2指向的变量的值,然后赋值给v1指向的变量 *a = *b; // 赋值给v2指向的变量 *b = temp; }