# python ,java 没有指针概念
# go 中有指针概念,用起来比较简单
# c 中指针,用起来比较复杂
# 指针是什么?
指针是变量,存储变量内存地址
指针是存储变量内存地址的变量
义指针类型变量和取变量地址
#include <stdio.h>
/*
1 在定义变量时 * 放在变量名前 【int *v2】 表示定义一个指向这个类型的指针---》定义一个指针变量--》定义一个变量
2 &放在变量前【&v1】,表示取这个变量的地址
3 *放在指针变量前,表示解引用---》拿到指针变量指向地址具体的值
*/
void main() {
// 定义指针
int v1=66;
// v2 是指针类型,存储了v1的内存地址
int *v2=&v1;
printf("%d\n",*v2); //66
printf("%p\n",v2); // 000000e9069ff8b4 是变量v1的内存地址
printf("%p\n",&v1); // 000000e9069ff8b4 是变量v1的内存地址
}
// 定义指针类型变量
int *v2
// 取变量地址,任意变量都可以取地址---》任意变量都会有地址
&v1
// 变量解引用
*v2 // v2必须是指针类型
printf("%d\n",*v2);
修改变量值
#include <stdio.h>
/*
1 在定义变量时 * 放在变量名前 【int *v2】 表示定义一个指向这个类型的指针---》定义一个指针变量--》定义一个变量
2 &放在变量前【&v1】,表示取这个变量的地址
3 *放在指针变量前,表示解引用---》拿到指针变量指向地址具体的值
*/
void main() {
// 定义指针
int v1 = 66;
// v2 是指针类型,存储了v1的内存地址
int *v2 = &v1;
printf("%p\n", v2);
v1 = 99;
printf("%d\n", v1);
printf("%p\n", v2);
printf("%d\n",*v2); // 改了v1的值,对v2解引用后,就是改后的值
}
通过指针修改变量的值
#include <stdio.h>
void main() {
// 通过指针修改变量值
int v1 =666;
int *v2=&v1;
// 改v1的值有两种方式
// 通过v1直接改
// 通过指针 v2改 *v2 等同于写了 v1
*v2=999;
printf("%d\n",v1);
}
指针类型参数
// 把指针类型变量,当参数传到函数中
数组的指针(指针运算)
#include <stdio.h>
void changePointA(int *p){
*p=99; // 通过指针改原变量
}
void changeA(int a){
a=99;
}
void main() {
int a =10;
int *p =&a;
//changePointA(p);
changeA(a);
printf("%d\n",a); // a会变成99
}
// 把变量当参数传到函数中,修改变量,不会影响原来的值,但是把变量的指针传入,修改就会影响原来的
指针的指针
#include <stdio.h>
void main() {
// 任何变量都会有地址,既然有地址,就可以取地址
int a = 10;
int *b = &a;
//定义一个变量,指向b的指针
int **c = &b;
int ***d =&c;
printf("%p\n",b);
printf("%p\n",c);
printf("%d\n",d);
// *c b
// *b a
// b=&a
//*c=&(*b); // 其实啥都没做,不建议这么写
printf("%p\n",b);
printf("%p\n",c);
printf("%p\n",d);
// 解引用
printf("%p\n",*d); // *d 是c
printf("%p\n",**d); // 对 d 解两次引用是 b
printf("%d\n",***d); // 对 d 解三次引用是 a 是10
}