「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
指针
-
变量:通过变量名访问变量
- 内存中对应的地址存放变量的值(以字节为单位分配大小),访问时只有编译器知道变量和值之间的对应关系(通过变量和地址的对应关系确定,且变量始终指向首地址)
- 举例
-
指针与指针变量
- 指针是地址,指针变量指的是存储的内容为指针(地址)
-
定义指针变量:类型名 *指针变量名。(指针变量的类型即为所指向地址存储值的类型)
- char *pa; 定义一个指向字符型的指针变量
- int *pb; 定义一个指向整型的指针变量
- 举例
-
取地址运算符和取值运算符
- 如果需要获取某个变量的地址,可以使用取地址运算符(&):char *pa=&a; int *pb=&f;
- 如果需要访问指针变量指向的数据,可以使用取值运算符(*):printf("%c,%d\n",*pa,*pb);
- 举例
- 结果(指针变量存储的是地址,所以都是整型)
-
注意:避免访问未初始化的指针
- 举例:a没有初始化而直接赋值会出错,因为此时该指针为野指针 (此时会随机寻找地址进行赋值,非常危险)
- 举例:a没有初始化而直接赋值会出错,因为此时该指针为野指针 (此时会随机寻找地址进行赋值,非常危险)
数组与指针
-
虽然数组和指针关系密切,但数组绝对不是指针
- 举例1(指针使用scanf赋值)
- 结果1
- 举例2(数组使用scanf赋值)
- 结果2
- 举例1(指针使用scanf赋值)
-
数组的地址连续存放,且大小相同
- 举例
- 结果
- 举例
-
指向数组的指针
-
用一个指针指向数组,操作如下
- char *p;
- p=a;或者 p=&a[0];
-
-
指针的运算
-
当指针指向数组元素的时候,可以对指针变量进行加减运算,这样做的意义相当于指向距离指针所在位置向前或向后第n个元素
- 举例
- 结果
- 举例
- 对比标准的下标法访问数组元素,这种使用指针进行间接访问的方法叫做指针法
-
需要强调:p+1不是简单的将地址加1,而是指向数组的下一个元素(为什么?因为在定义指针的时候便定义了指针的类型,指针加1代表该类型所占地址加1)
- 举例
- 结果
- 举例
-
-
使用指针定义,再使用数组访问
- 举例
- 结果
- 举例
-
注意:数组名其实是数组第一个元素的地址
- 举例
- 结果(数组名和数组第一个元素的地址相同)
- 举例