指针的综合运用
//////////////////////////////////////////////////////////////////////////////例程1////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{ int x=10;
int y= 8;
int *p;//注意此时*号是一个标识符,表示的是指针
p=&x; // 指针存放的便是地址,所以需要使用地址进行赋值,使用了取地址符号&
//指针的赋值,和其他的变量差不多,可以重复进行赋值,前一次的赋值将会被覆盖
p=&y;
printf("通过指针进行变量的地址的打印;%p\n",p); // 注意这里打印的是变量的地址
printf("通过变量名访问变量的值:%d\n",x);
printf("通过变量名访问变量的值:%d\n",y);
printf ("打印变量的地址:%p\n",&x);
printf ("打印变量的地址:%p\n",&y);
printf ("通过变量的地址访问变量的值:%d\n",*(&x));//注意通过地址访问变量的值,通过&符号取地址,再通过*符号读取对应地址的值,****重点 重点 重点
//注意此时符号*相当于一种运算符,相当于加、减、乘、除
printf("通过变量的地址访问变量的值:%d\n",*(&y));
//指针=地址
printf("通过指针输出变量的值:%d\n",*p);//此时*号表示取出指针所含的地址的值。
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程2////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 10; //此时存放的是一个整数,并进行初始化
a = 100; //给整型变量进行赋值
char b = 'c'; //此时存放的是一个字符, 并进行初始化
b = 'h'; //对字符变量进行赋值
int arry[3] = {1, 2, 3}; //此时存放的是一串数据 并进行初始化
//指针变量存放的便是地址。
// 1.相同点:
// 都是变量
// 2.不同点;
//变量名不同
// 变量的类型不同
//指针变量的申明
int *p; //定义指针的方法一,通过int定义一个指针
p=&a;//对指针变量进行赋值,注意此时附加的值是一个地址,此时便可以说明指针变量是用来存放地址的变量,指针也是一个变量
// int *p1 = &a; //定义指针的方法二,同时进行初始化,该方法时通过指针定义一个变量,简单的说便是指针变量
//注意不能同时定义两个指针变量名相同的指针变量。
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////例程3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{
int*p;
char* p2;
int *p3;
int a=10;
char c='A';
int arry[3]={1,2,3}; // 定义数组
p=&a; //对指针变量进行整形变量的地址的赋值
p2=&c;//对指针变量进行字符型变量的地址赋值,注意字符变量也具有自己的地址,不能和后面的字符串混淆
// p3=&arry[0];//对指针变量进行数组的地址的赋值,重点: 数组的第一个元素的地址可以代表数组的地址,这里在前面已经讲解,不再重复讲解,方式一
p3=arry;//对指针变量进行数组的地址的赋值,数组名表示的就是数组的地址方式二
printf("通过指针变量打印整型变量的地址:%p\n",p);
printf("通过指针变量打印字符变量的地址:%p\n",p2);
// printf("通过指针变量打印数组变量的地址:%p\n",p3);//此时打印的是第一个字符变量的地址
// printf("通过指针变量打印数组变量的地址:%p\n",p3++); //注意指针所指向的地址发生了偏移
// printf("通过指针变量打印数组变量的地址:%p\n",p3++); //注意指针所指向的地址发生了偏移
// printf("通过指针变量打印数组变量的地址:%p\n",p3);
// 注意在前面指针所指向的地址进行了移位,后面的打印将会出现变化,应当注意
//printf("通过指针变量打印字符型变量的值:%c\n",*p2);
// printf("通过指针打印数组元素的值:%d\n",*p3++); //通过指针变量打印数组的元素以后,对指针所指向的地址进行移动指向下一个元素的地址
// printf("通过指针打印数组元素的值:%d\n",*p3++); //通过指针变量打印数组的元素以后,对指针所指向的地址进行移动指向下一个元素的地址
// printf("通过指针打印数组元素的值:%d\n",*p3);
//通过循环将数组进行遍历
int i;
for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++){
// printf("通过指针变量对数组进行遍历%d\n",p3[i]); //通过指针的方式遍历数组的元素,这里简单的说明了指针也可以看作是数组。
printf("通过指针的方式遍历进行遍历%d\n",*p3++); // 注意这里没有只用到符号“i”,所以需要进行p3++ 操作
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程4///////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{ // 指针的运用,系统对指针变量的内存的分布是随机的,不是确定的,但是可以采用指针将特定的数,存入特定的指针当中
int a;
a=10;
int *p;
p= &a;
printf("通过指针对变量地址进行打印: %p\n",p);
//通过指针将1存入地址位0060FF00的地址
volatile int *p2= (volatile int*)0x0060ff00;// 将地址强制的转换成指针的地址,volatile的作用是让CPU再进行当访问值的时候,不通过寄存器访问,直接通过指针的地址进行访问
//这样访问的数据时时都是更新的,因为通过寄存器访问可能没有访问到改变后的值,出现相应的错误。但是没有寄存器访问的速度快
*p2=5;
printf("p2的地址是:%p\n",p2);
printf("打印指针p2存放的数值:%d\n",*p2);
system("pause");
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////例程5///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
函数的封装一
/*
void zhuanhuan(int a,int b){// 注意此时在进行函数的封装的时候,定义的形式参数,相当于一个局部的变量,拥有自己独立的地址
int temp;
temp=a;
a=b;
b=temp;
printf("输出形式参数中a,b的值:%d %d\n",a,b); //此时输出的a,b的值,是形式参数中局部变量a,b的值。
}
*/
//函数的封装二
void zhuanhuan1(int *p, int *p1){
int temp;
//事实上此时的改变便是对变量a,b 的值进行改变。
temp=*p; //此时便是将指针中的数值取出来,通过*号进行取值,再将值赋值给变量temp
*p=*p1; //注意此时是将指针中的数据,赋值给另一个指针,注意事实上此时的指针便是代表的变量的a,b 的地址。
*p1=temp; //注意此时便是将变量temp变量赋值给指针p1,同时也要将指针通过*符号进行取值。
}
int main()
{//1.数值的转换
int a=10;
int b=5;
int temp;
//temp=a;
//a=b;
//b=temp;
printf("打印变量a,b的值: %d %d",a,b);//没有通过转换函数前的变量a,b 的值
//将函数进行封装
//zhuanhuan(a,b); //此处在进行传参的时候,指示简单的将a,b变量的值,传输给封装函数的形式参数,并没有将地址传送给形式参数
//printf("打印指向转换函数以后,a,b的值:%d %d",a,b);//从运行的结果可以看出,a,b的值并没有发生改变
zhuanhuan1(&a,&b); //此时在进行传参的时候,是将a, b,变量的地址传输给形式参数。同时形式参数为指针变量。
printf("打印指向转换函数以后的变量a,b的值:%d %d",a,b);//此时打印的变量a,b,的值。是转换结束后的值,a,b的值发生了改变
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////例程6//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=2; //定义整形的变量
int b=4; //定义整形的变量
int c=10; //定义整形的变量
int* arry[3]; //定义指针变量的数组,注意此时数组中的每一个元素都是一个指针
arry[0]=&a; //用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
arry[1]=&b;//用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
arry[2]=&c;//用整形变量的地址给指针变量的数组的元素进行赋值,在指针变量的数组中,数组的每一个元素都是指针,用于储存地址,储存的类型,有数组的类型决定
printf("此时指针数组打印函数变量的地址:\n");
//遍历指针变量数组
int i;
for(i=0;i<3;i++){
printf("打印指针变量数组中的元素地址所包含的数值是:%d\n",*(arry[i])); //此时通过i,切换指针遍历数组的索引,切换不同的地址。通过*符号取出地址中的值。
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////例程7///////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{ //上一节我们讲的是指针变量数组,表示的是一个数组
//这一节我们将要讲的便是数组的指针,表示的是一个指针
//定义一个数组
int arry[3]={1,2,3};//注意在进行数组的声明的时候应当书写数组变量的类型,不然将会出现错误。
int (*p)[3];//定义一个数组指针,数组指针表示的是指针
int *p2;
p2= arry; // 用数组的地址给指针进行赋值
p=arry;//此处采用的表示数组的数组名对p指针进行赋值,因为数组的变量的名便是数组的地址,所以此处给指针P的赋值依旧的是一个地址,完全符合指针的定义
//上面的赋值也充分的说明了变量P是一个指针变量。
printf("通过数组的变量名对数组的地址进行访问:%p\n",arry);
printf("通过数组的首地址对数组的地址进行访问:%p\n",&arry[0]);
printf("通过普通的指针对数组的地址进行访问:%p\n",p2);
printf("通过数组指针对数组的地址进行访问:%p\n",p);
//上面三种方法打印的地址将会是一样的结果
printf("==================================区别来了,在下面,大家注意了============================================\n");
printf("通过数组指针对指针的址进行偏移%p\n",++p);//从运行的结果可以看出,数组指针的指针偏移量为12位,也就是当前指针数组的大小
printf ("通过普通的指针对指针的地址进行偏移:%p\n",++p2);// 此时普通的指针的指针偏移量是4位,也就是一个数据类型的偏移量
//由上面可以看出指针数组的偏移量是整个指针数组的长度。重点 、重点、、重点
system("pause");
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////例程8/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
int main()
{ int a; //定义一个整形的变量
int *p; //定义一个整形的指针,注意此时的指针为野指针,这个话题在后面会详细的讲解
int arry[5];//定义含有五个元素的整形数组
int *p[5]; //定义一个指针数组,表示的是一个数组,数组的元素全是指针,用于存放地址
int (*p)[4]; //定义一个数组指针,此时表示的便是一个指针,注意,此时指针的跨度时整个数组。
int* p();// 定义一个返回值为指针的函数,指针函数
int (*p)();// 此时定义的是一个函数指针,返回值是整形的
int **p;//定义二级指针
void *p;//此时定义的指向空的对象的指针
//对于指针的学习就到此结束,注意牢记指针所装载的东西永远是地址。重点 重点 重点
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律