C语言指针入门学习、概念梳理(一)
C语言指针入门学习、概念梳理(二)
指针的重要性不言而喻,是C语言的核心内容之,不过忘得差不多了,最近因个人发展原因开始重拾C语言知识,现将郝斌老师视频学习笔记整理成博文,方便日后复盘巩固,能力有限,若有不足之处,还望各位指正。
C语言指针学习(一)
指针用法简单介绍
首先,搞清楚指针是什么? -------指针就是个地址,指针和地址是一个概念
那地址又是什么? ----- 地址就是内存单元的编号
以内存条为例,里面分很多小单元,其中一个单元有八位(存放8个0或8个1),也就是说内存的编号是以字节来算的,而不是位。不是一个0/1为一个编号,而是8个0/1作为一个编号如1000 0010为一个编号,即一个字节,该编号即为地址。
- 程序示例1
# include <stdio.h>
int main(void)
{
int * p; //p是变量的名字,int * 表示p变量存放的是int类型变量的地址,p只能存放整形变量地址。
int i = 3; // i是整形变量,但P = i;是非法的 P = &i;才合法,&i为取整形变量i的地址,并将其放到指针变量p中
p = &i; //ok
//p = i; //error,类型不一致,p只能存放int型变量的地址,不能存放int类型变量的值
//p = 55; //error,理由同上一行
return 0;
}
若以上程序中int * p改为 double * p, 即指针变量p只能存放双精度类型变量地址,此时 p = &i 就是错误的。
- 程序示例2
# include <stdio.h>
int main(void)
{
int * P; //**p是变量的名字,int * 表示p变量存放的是int类型变量的地址**,p只能存放整形变量地址。
int i = 3;
p = &i;
return 0;
}
如何理解 p = & i;
- p保存了i的地址,因此p指向i
- p不是i ,i也不是p,或者说修改p的值不影响i的值,修改i的值也不影响p的值,这是两个变量
- p本来是个普通变量,只能存放整数。只不过前面加上*号后成了存放整型变量的地址,即此时p为指针变量。
- 如果一个指针变量指向了某个普通变量,则 *指针变量 完全等同于 普通变量 即 *p 等同于 i
举例:如果p是个指针变量,并且存放了普通变量i的地址,则p指向普通变量 i, p就完全等同于 i
或者说:在所有出现p的地方都可以替换成 i,在所有出现 i 的地方都可以替换成 *p
要真正理解指针,还需要搞清楚*,*p, p,&p的含义,两个星号意义不同。 p = &i ; *p = i (内容相同);
int * p; //本行为声明,此时p是变量名,int * 是数据类型,*告诉你p是一个指针变量,只能存放整型变量地址,
//勿理解为* p是一个变量,所以才有 p = &__的格式限制,下划线处为整型变量i
//int * p;不表示定义了一个名字叫*p的变量,而是表示p是变量名,p变量的数据类型是int * 类型
//int * 类型,实际就是存放int变量地址的类型
j = *p; //*是指针运算符,为&的逆运算,可以取出指针变量指向的地址中存放的值
*p也可以通俗得理解成取快递:
查看取货码(p = &i):1123 (&i取地址),也就是获取包裹在驿站中所对应的地址(1楼1货架第2层第3个包裹)
取出包裹(*p):星号为取出所指向地址中的值
# include <stdio.h>
int main(void)
{
int * P; //**p是变量的名字,int * 表示p变量存放的是int类型变量的地址**,p只能存放整形变量地址。
int i = 3;
int j;
p = &i;
j = *p; //等同于j=i; 因为*p等同于i, *p代表以p的变量内容为地址的一个变量,即以i的地址为地址的变量,就是i
printf("i = %d,j = %d/n",i,j)
return 0;
}
结果: i = 3, j = 3
指针和指针变量的区别
- 指针就是地址,地址就是指针
- 地址就是内存单元的编号
- 指针=地址=存放地址的编号
- 整形变量是用来存放整数的变量,指针变量是用来存放地址(指针)的变量。(即指针为水,指针变量为杯子)
- 指针是内存地址,而指针变量是保存内存地址的一个普通变量
- p是指针变量,本身也是变量,自身存放的地址叫指针。
- 指针变量是一个变量,任何一个相同类型的变量地址都可以给它赋值,一旦赋值,指针就确认了,即内存单元编号就确定了
- 指针和指针变量是两个不同的概念,但注意:通常我们叙述时会把指针变量简称为指针,实际含义并不一样