C语言——指针

本文深入解析C语言中的指针概念,包括定义、运算、与数组的关系及实用技巧,帮助读者掌握指针的高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针

就是"变量空间" 的首地址

地址:就是物理空间上地址的连续编号
指针变量:专门存储地址常量的变量

定义
类型* 变量名;

注:指针变量分配4byte空间

运算符
&变量 //取变量的地址
*地址 //取地址所在空间的内容
指针的运算
指针 +/- 常量;
int *pa;
pa+n;//代表从指向位置向后移动n个元素单位的地址
指针 - 指针;//得到两个元素地址区间的元素个数

一个指针的简单实用例子

	int a=100;			//定义整型变量并初始化
	int* pa=&a;			//定义指针变量并初始化
	printf("sizeof(pa)=%d  &pa=%x &a=%x\n",sizeof(pa),&pa,&a);
	//打印pa所占字节数  pa的地址  a的地址
	printf("pa=%x\n",pa);		//打印pa的内容-----a的地址
	printf("%d %d\n",a,*pa);	//打印a 的两种方法

结果图:
在这里插入图片描述
一维指针存放的就是普通变量的地址

利用指针来交换两数:

void swap(int *pa,int *pb)	//定义交换函数
{
        *pa=*pa^*pb;		//交换a,b两数,不可对地址进行操作,更不可直接传入a,b来操作
        *pb=*pa^*pb;
        *pa=*pa^*pb;
}
int main()
{
        int a=10,b=20;
        printf("开始时:a=%d,b=%d\n",a,b);	//打印开始时a,b的值
        swap(&a,&b);				//调用函数
        printf("交换后:a=%d,b=%d\n",a,b);	//打印交换后a,b的值
        return 0;
}

结果图:
在这里插入图片描述

指针与数组

数组:一块连续的同类型空间
数组名:即为这块空间的首地址
指针数组:可以存放多个指针的数组
即一个数组里面存放的全是指针变量:

        int a=10;		//定义a
        int *pa=&a;		//定义a的指针
        int b=20;		//定义b
        int *pb=&b;		//定义b的指针
        int c=30;		//定义c
        int *pc=&c;		//定义c的指针
        int *p[3]={pa,pb,pc};	//定义指针数组,存放pa,pb,pc
        printf("%x  %x  %x\n",p[0],p[1],p[2]);		//输出指针数组的内容
        printf("%d  %d  %d\n",*p[0],*p[1],*p[2]);	//输出指针数组内容的内容

结果:
在这里插入图片描述
数组的指针:指向数组的指针
这里讨论二维数组与指针的关系:

	int buf[3][4]={ {1,2,3,4},\
                        {11,12,13,14},\
                        {21,22,23,24}};	//定义一个二维数组

        printf("%d   %x\n",buf[0][0],&buf[0][0]);	//探究二维数组行与列之间的关系
        printf("%d   %x\n",buf[1][0],&buf[1][0]);	//输出每行的首元素与其地址
        printf("%d   %x\n",buf[2][0],&buf[2][0]);	

        int arr[4]={1,2,3,4};			//定义一个以为数组
        printf("%x   %x\n",arr,arr+1);	//一维数组的首地址与+1后的地址
        printf("%x   %x\n",buf,buf+1);	//二维数组的首地址与+1后的地址

        int (*p)[4]=buf;			//定义二维数组的指针
	//输出二维数组的第二行第三列的数
        printf("%d %d %d %d\n",*(*(p+1)+2),p[1][2],(*(p+1))[2],*(p[1]+2));
        printf("%d %d %d %d\n",*(*(buf+1)+2),buf[1][2],(*(buf+1))[2],*(buf[1]+2));

结果:
在这里插入图片描述
对比结果我们可以发现:

  1. 以为数组+1指向下一列,二维数组+1指向下一行
  2. 通过输出第二行第三列的数,我们可以发现二维数组与其指针用法一样
  3. 通过2的结论我们可以得到一个语法糖(特别关键
    *(p+1) == p[1]
    这个结论非常重要,在C语言指针的学习中一直都会遇见

小技巧:由于在内存空间中二维数组是以一维形式存在的,所以我们可以定义一个一维指针来输出一个二维数组

	int buf[][5]={	{1,2,3,4,5},\
				{6,7,8,9,10},\
				{11,12,13,14,15},\
				{16,17,18,19,20}};	//定义二维数组
        int *p=buf[0];		//定义一维指针指向二维数组第一行第一个元素的地址
        int len=sizeof(buf)/sizeof(int),i;	//求数组长度

        for(i=0;i<len;i++)
                printf("%d ",*(p+i));		//输出
        printf("\n");

结果:
在这里插入图片描述

一定要记住 *(p+1)=p[1] 这个语法糖

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值