C40-指针
一 指针的引入
-
什么是指针:指针是一个变量,其值是另一个变量的内存地址
-
简单的使用地址输出一个变量:
-
代码示例
#include <stdio.h> int main() {int a=10;printf("a的地址是:%p\n",&a);printf("a=%d\n",*(&a)); //*号是取值运算符return 0; }
-
成果展示:
- 报错与总结:无
-
二 指针变量的引入
- 整型变量→存放整型数的变量
- 字符变量→存放字符型数据的变量
由此,指针变量就是存放指针的变量,存放地址的变量
指针变量的声明:
int *ptr; //声明一个指向int类型的变量ptr
double *dp; //声明一个指向double类型的变量dp
需要强调的是:"*"在声明指针变量时作用是:表示声明指针变量;而在其它地方用于解引指针
示例:通过指针变量访问并输出一个变量
- 代码示例:
#include <stdio.h>
int main()
{int a=10;int *p;p=&a;printf("a的地址是:%p\n",&a);printf("通过变量名访问a:%d\n",a);printf("通过地址访问a:%d\n",*(&a));printf("通过指针变量访问a:%d\n",*p);return 0;
}
- 成果展示:
- 报错与总结:无
三 指针变量为什么要求类型
原因:
- 内存访问:不同类型数据占内存空间不同,指针类型决定解引用时读取字节数,避免错误读写
- 指针运算:指针运算偏移量与指向类型相关,类型不符则无法正确计算偏移
实验:对比正确与错误的指针类型的地址访问、数据访问、指针偏移
正确的
- 代码示例:
#include <stdio.h>
int main()
{int a=0x1234;int *p=&a;puts("我们在这里测试指针的地址:");printf("p:%p\n",p);puts("\n我们在这里测试通过指针访问变量:");printf("来自p的测试:%x\n",*p);puts("\n我们在这里测试指针偏移:");printf("++p:%p\n",++p);return 0;
}
- 成果展示:
- 报错与总结:
错误的
- 代码示例:
#include <stdio.h>
int main()
{int a=0x1234;int *p=&a;char *c=&a;puts("我们在这里测试指针的地址:");printf("c:%p\n",c);puts("\n我们在这里测试通过指针访问变量:");printf("来自c的测试:%x\n",*c);puts("\n我们在这里测试指针偏移:");priintf("++c:%p\n",++c);return 0;
}
- 成果展示:我们发现,指针类型不兼容从而导致报错
- 报错与总结:
无