指针
1、 指针的基本概念
指针的作用: 可以通过指针间接访问内存
-
内存编号是从0开始记录的,一般用十六进制数字表示
-
可以利用指针变量保存地址
2、指针变量的定义和使用
指针变量定义语法: `数据类型 * 变量名
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int* p1 = &a;
int* p2 = &b;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
printf("a:%d b:%d\n", a, b);
int n = *p1;
*p1 = *p2;
*p2 = n;
printf("a:%d b:%d\n", a, b);
system("pause");
return 0;
}
指针变量和普通变量的区别
- 普通变量存放的是数据,指针变量存放的是地址
- 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用
3、空指针和野指针
空指针:指针变量指向内存中编号为0的空间
**用途:**初始化指针变量
**注意:**空指针指向的内存是不可以访问的
示例1:空指针
int main() {
//指针变量p指向内存地址编号为0的空间
int * p = NULL;
//访问空指针报错
//内存编号0 ~255为系统占用内存,不允许用户访问
printf("%d",*p);
system("pause");
return 0;
}
示例2:野指针
int main() {
//指针变量p指向内存地址编号为0x1100的空间
int * p = (int *)0x1100;
//访问野指针报错
printf("%d",*p);
system("pause");
return 0;
}
4、指针的加减
int 类型的指针 +1,指针跳一个int大小
char 类型的指针 +1,指针跳一个char大小
- p1 + 1 => 下一个地址 => 地址 + 类型大小
- p1 - 1 => 前一个地址 => 地址 - 类型大小
- p2 - p1 => 求两个地址之间有几个类型 => (p2 - p1) / 类型大小
int a = 10;
char ch = 'a';
int* p = &a;
char* pCh = &ch;
printf("a的地址:%p\n", p);
printf("a+1的地址:%p\n\n", p+1);
printf("ch的地址:%p\n", pCh);
printf("ch+1的地址:%p\n", pCh+1);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gxn7COzm-1647404045350)(C:\Users\14604\AppData\Roaming\Typora\typora-user-images\image-20220307175526161.png)]
5、指针和数组
**作用:**利用指针访问数组中元素
指针与数组
1.数组名等价 => 数组地址
2.数组名不等价于与指针 => 数组地址不可修改
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//3.假设有一个数组a,整型,有5个元素,通过键盘输入数组各元素,要输出数组各元素的值。
//要求:采用指针法,如*(a + i)形式输出数组各元素, 其中a为数组名
int main()
{
int ary[5] = { 0 };
printf("请输入5个整数:");
for (int i = 0; i < 5; i++)
{
scanf("%d", &ary[i]);
}
int* a = ary;
printf("ary[5]={");
for (int i = 0; i < 5; i++)
{
printf("%d ", *(a + i));
}
printf("}\n");
system("pause");
return 0;
}
6、指针和函数
**作用:**利用指针作函数参数,可以修改实参的值
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//1.编写函数,实现使用指针交换两数
void Swap(int* a, int* b)
{
int n = *a;
*a = *b;
*b = n;
}
int main()
{
int a = 0;
int b = 0;
printf("请输入两个数:");
scanf("%d%d", &a, &b);
printf("a:%d b:%d\n",a,b);
Swap(&a, &b);
printf("a:%d b:%d\n", a, b);
system("pause");
return 0;
}