#include<stdio.h>//一、访问的访问有两种方式//1.通过变量名直接访问 2.通过地址间接访问intmain(){int home =100;printf("home是:%d\n",home);//1.通过变量名访问printf("home的地址是:%p\n",&home);//二、&取地址,取变量名所代表的变量所在的内存地址printf("home是:%d",*(&home));//三、* 此时作为 取出内存地址中的数据的值 的运算符//四、指针=地址}
2.指针变量的引入
#include<stdio.h>intmain(){int a =10;//整型变量—存放的是整数char c ='c';//字符变量—存放的是字符int array[3]={1,2,3};//数组—存放的是一组数据int* p;//指针变量—存放的是地址
p =&a;//p中存放a的地址int* p2 =&a;//定义并初始化一个指针变量/*只有在定义一个指针变量时,*才是指针的标识符
其他情况下*都是运算符*/}
#include<stdio.h>intmain(){int a =10;int* pa =&a;printf("%d\n", pa);//以十进制输出pa中的内容(十进制形式输出a的地址)printf("%p\n", pa);//输出指针变量pa中的内容,与%d一样(十六进制)printf("%x\n", pa);//输出十六进制pa中存放的内容(还是a的地址)printf("%x\n",&pa);//以十六进制输出指针变量pa的地址printf("%d\n",*pa);//以十进制输出pa所指的地址内存放的内容(a里头的数)printf("%x\n",*(&pa));//以十六进制输出pa内的内容}
3.指针的概念总结
4.通过指针来访问变量
5.指针分类型&指针与数组
#include<stdio.h>intmain(){int a =10;//整型变量—存放的是整数int* pa;
pa =&a;printf("a的地址是:%p\n",pa);printf("a的地址++是:%p\n",++pa);//地址++后移动一个整数类型的大小,即4个字节int array[3]={1,2,3};//数组—存放的是一组数据int* parray;//指针变量—存放的是地址
parray =&array;//由下面两行代码执行结果对比发现,将数组名赋值给指针变量等价于将数组的首地址赋值给指针变量printf("a0的地址是:%p\n",&array[0]);printf("array的地址是:%p\n", parray);printf("++array的地址是:%p\n",++parray);printf("parray对应的值是:%d\n",* parray);//提取首地址对应的变量记得解引用printf("parray[0]对应的值是:%d\n", parray[0]);//或者用指针变量+下标的方式打印首个变量}
6.指针数组函数的综合
#include<stdio.h>//提示用户找到10个数,并找出其中的最大值、最小值,并计算它们的平均值voidinputing(int* datas,int size)//提示用户输入第几个数,获取用户的输入{int i;for(i =0;i < size;i++){printf("请输入第%d个数:", i +1);scanf_s("%d", datas);if(*datas >100||*datas <0){printf("超出范围,请重新进入程序\n");system("pause\n");exit(-1);}
datas++;}}voidprinting(int* datas,int size){for(int i=0;i<size;i++){printf("第%d个学生的成绩是%d\n",i+1,datas[i]);}}intbest(int* datas,int size){int max = datas[0];for(int i =0;i < size;i++){if(max < datas[i])
max = datas[i];//不断将更大值赋给max}printf("最大值为:%d\n", max);return max;}intlowest(int* datas,int size){int min = datas[0];for(int i =0;i <size;i++){if(min > datas[i])
min = datas[i];//不断将更小值赋给min}printf("最小值为:%d\n", min);return min;}floatav(int datas[],int size){int sum =0;float av =0;for(int i =0;i < size;i++){
sum += datas[i];}
av =(float)sum / size;printf("平均值是:%d\n", av);return av;}intmain(){//定义一个10个整数的整数型数组(初始化数组)int array[10];int* p;
p = array;int len;
len =sizeof(array)/sizeof(array[0]);//不可以写成sizeof(p)是因为p代表首地址即p[0],不代表一段长度//1.输入数据inputing(p,len);//2.打印数据printing(p, len);//3.找最高分best(p, len);//4.找最低分lowest(p, len);//5.算平均值av(p, len);}
7.指针死怼这几件事就对了
8.为什么要用指针一
把数据强制保存到我所希望保存到的地方(volatile)
9.为什么要用指针二
通过地址间接访问变量,修改变量
10.为什么要用指针三
11.指针数组
数组指针:数组内每个元素都是指针(好多指针的集合)
#include<stdio.h>intmain(){//以整型指针为例int a =1, b =2, c =3;int* parray[3];//多个指针叫指针数组
parray[0]=&a;
parray[1]=&b;
parray[2]=&c;//三个毫不相关的整数地址for(int i =0;i <3;i++){printf("%d\n",* parray[i]);}}
#include<stdio.h>intmain(){//malloc函数的原型是void *malloc(size_t),是个指针函数//void代表返回值无类型(有返回值,但不知道类型是什么)//size_t代表申请空间大小(字节数大小)//malloc函数可以开辟一块空间int n;printf("请输入要存放的整数型元素个数总数:");scanf_s("%d",&n);//回忆之前的输入数组长度失败案例:int array[n]——只能通过写死(常数)来决定数组长度//malloc可以做到输入数组长度int* parray =(int*)malloc(n *sizeof(int));//开辟了n*4个字节的空间//(int*)将无类型的malloc转换为整数型的指针//一个整数4个字节,n个整数乘以nfor(int i =0;i < n;i++){printf("请输入第%d个学生的成绩:", i +1);scanf_s("%d",&parray[i]);//将成绩存进开辟的空间里}for(int i =0;i < n;i++){printf("第%d个学生的成绩是:%d\n", i +1, parray[i]);}}