目录
前言:
上一篇博客中我们了解到指针的两个运算符号":
一个是星号*
,一个是&
,他们的名字分别是指针运算符和取地址运算符。
1.指针运算符
1.1
指针运算符和取地址运算符是一对"互逆"的运算符。
指针运算符*是取出某个内存地址里面存储的变量的数据;
取地址运算符&是获取某个存储了数据的变量的内存地址。
1.2
cs
int number_1=10;
int number_2=55;
int *p1;
p1=&number_1;
printf("%d\n",p1);
p2=&number_2;
printf("%d\n",p2);
1.定义了两个整型变量number_1和number_2
int number_1 = 10;
int number_2 = 55;
2.定义了一个指针p1
int *p1;
3.取出变量number_1的地址赋值给指针p1
p1 = &number_1;
cs
int number_1=10;
int number_2=55;
int *p1;
p1=&number_1;
printf("%d\n",p1);
p2=&number_2;
printf("%d\n",p2);
4.打印指针p1内存地址里存储的数据
printf("%d\n", *p1);
5.再取出变量number_2的地址赋值给指针p
p1 = &number_2;
6.打印指针p2内存地址里存储的数据
printf("%d\n", *p1)
1.3
这里:
*
星号是指针运算符,它的作用是访问这个内存地址所存储的数据。
&
是取地址运算符,它的作用是获取这个变量对应的内存地址。
我们再来看看一个指针的内存地址和内存地址所存储的数据:
cs
int number_1=5;
int *p1;
p1=&number_1;
printf("内存地址%p\n",p1);
printf("内存地址中的所有数据为%d\n",*p1);
1.定义一个变量
int number_1 = 5;
2.定义一个指针
int *p1;
3.把变量number_1的内存地址赋值给p1
p1 = &number_1;
4.打印这个内存地址,注意格式符号是%p
printf("内存地址%p\n", p1);
5.打印这个内存地址所存储数据
printf("内存地址所存的数据%d\n", *p1);
1.4
之所以说这两个符号是"互逆"的,
是因为一个符号是知道内存地址,然后访问这个内存地址所存储的数据------指针运算符*
;
另一个符号是知道变量数据,然后取出这个变量数据的内存地址------取地址运算符&
我们知道指针运算符可以访问内存地址所存储的数据,同时它还可以修改内存地址所存储的数据。
接下来我们来学习指针的赋值和运算等等会修改指针指向的数据的方式:
2.指针的运算和使用
2.1
除了访问指针所指向的数据以外,我们还可以给指针所指向的变量进行赋值,也就是修改它的数据。
cs
int a=1;
int*p;
p=&a;
printf("%d\n",*p);
*p=100;
printf("%d\n",*p);
printf("%d\n",a);
1.定义一个整型变量和指针
int a = 1;
int *p;
2.把变量a的地址指向指针p
p = &a;
3.打印p的值
printf("%d\n", *p);
cs
int a=1;
int*p;
p=&a;
printf("%d\n",*p);
*p=100;
printf("%d\n",*p);
printf("%d\n",a);
4.修改指针p指向的数据,给它赋值100
*p = 100;
5.打印指针p指向的数据值
printf("%d\n", *p);
6.打印变量a的数据,我们可以发现它的值也改变了,成了100
printf("%d\n", a);
2.2
我们可以看到随着指针p所指向的数值改变了,变量a的数值也改变了,这是因为指针p指向的就是变量a的内存地址。
可以理解为,当指针指向某个变量的内存地址的时候,这个指针和这个变量,已经关联上了。
改变指针或者变量的数值,另外一方的数据也会随之改变。这是因为他们共享了同一个内存地址。
2.3
同样的我们可以对指针进行自增和自减操作:
cs
int a=1;
int *p;
p =&a;
printf("%d\n",*p);
*p++;
printf("%d\n",*p);
1.初始化变量,指针,以及把指针指向a
int a = 1;
int *p;
p = &a;
2.打印指针指向的值,1
printf("%d\n", *p);
3.指针指向的值自增
*p++;
4.打印指针指向的值,2
printf("%d\n", *p);
从运算符优先级来说,*
和&
都是高于自增自减符号的,所以*p++是先指针,再自增。
2.4
又如:
cs
int b=1;
int *p;
p=&b;
printf("%d\n",*p);
*p--;
printf("%d\n",*p);
输出结果为
1
0
2.5
除了四则运算以外,比较运算和逻辑运算也是一样的。
我们在写代码的时候只需要记住指针一旦指向了某个变量,他们之间就关联上了,或者说等价了。
对于指针的应用我们需要记住的是,一旦某个指针指向了变量,这时候这个指针就和这个变量关联上了。
对这个指针进行数据赋值和修改,就等同于对这个变量进行数据的赋值和修改,反之亦然。
3.易错点
指针p指向的是变量a的内存地址。
&
是取地址运算符;
*
是指针运算符,能够获取内存地址中存储的值。
4.思维导图
最后我想说的是:
在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。