2024龙年特别篇 -- 魔法指针 之 指针变量

目录

​编辑

 字符指针变量

字符指针

字符数组

关于字符数组的试题

 数组指针变量

数组指针

 利用指针数组打印数组

 打印二维数组

数组作为形参

 当形参为指针时(指针数组)

函数指针变量

 利用函数实现加法输出的多种方式


 字符指针变量

字符指针

char ch = ' w ';

char* pc = &ch;  //取ch的地址

含有 char* 叫字符指针

字符数组

int main()
{
	char ch[] = "abcdefg";
	char* pc = &ch;
	
	printf("%c\n", *pc);
	printf("%c\n", pc[4]);
	printf("%c\n", "abcdefg"[4]);
	return 0;
}

代码解释 

以上👆代码中:

1.ch 是个数组,里面存放着的值为 “abcdefg” 

2.pc 是指向 ch字符数组的一个指针

此外,字符数组还有另一种表达方式

int main()
{
	const char* pc = "abcdefg";

	printf("%c\n", *pc);
	printf("%c\n", pc[4]);
	printf("%c\n", "abcdefg"[4]);
	return 0;
}

控制台结果显示

代码解释

1. pc 是指向常量字符串 " abcdefg " 的一个指针

2.而且常量字符串不能修改!!!

 

关于字符数组的试题

该试题是在《剑指offer》的一道笔试题,已经过稍微改动 

int main()
{
    char str1[] = "hello bit.";
    char str2[] = "hello bit.";

    const char* str3 = "hello bit.";
    const char* str4 = "hello bit.";

    if (str1 == str2)
        printf("str1 and str2 are same\n");
    else
        printf("str1 and str2 are not same\n");

    if (str3 == str4)
        printf("str3 and str4 are same\n");
    else
        printf("str3 and str4 are not same\n");

    return 0;
}

看看这四个代码两两之间有什么区别? 

代码解释

 


 数组指针变量

数组指针

定义:int( * p)[n]; (注意优先级:()>[]> *)

栗子:(int (*p)[6]定义了一个指向含有6个元素的一维数组的指针。)

说明:

1.()优先级高,说明p是指针,指向一个整型的一维数组。

2.这个一维数组的长度是n,也可以说p的步长为n。

3.当p+1时,p指针会跨过n个整型数据的长度。

 利用指针数组打印数组

int main()
{
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(a) / sizeof(a[0]);
	int(*p)[10] = &a;
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", (*p)[i]);
	}
	printf("\n");
	return 0;
}

控制台结果显示: 


 打印二维数组

数组作为形参

row 行

cow 列 

void Print(int a[2][3], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
}

int main()
{
	int a[2][3] = { {1,2,3},{4,5,6} };

    //打印数组
	Print(a, 2, 3);

	return 0;
}

代码解释

在主函数 Print(a,2,3)中,

1.a表示数组首元素的地址

2.a[2][3]表示二行三列这个具体的值

 当形参为指针时(指针数组)

void Print(int(*p)[3], int r, int c)
{
	int i = 0;
	for (i = 0; i < r; i++)
	{
		int j = 0;
		for (j = 0; j < c; j++)
		{
			printf("%d ", *(*(p + i) + j));
		}
		printf("\n");
	}
}

int main()
{
	int a[2][3] = { {1,2,3},{4,5,6} };
	Print(a, 2, 3);

	return 0;
}

代码解释

上面👆代码中:

void Print(int(*p)[3], int r, int c)

这个涉及到二维数组传参的本质:

传递的是地址,传的是一维数组第一行的地址

控制台结果显示:

函数指针变量

函数指针变量:是用来存放函数指针地址的

我们先理解下面表格

表示
数组名数组首元素的地址
&数组名整个数组的地址

表示
函数函数的地址
&函数函数的地址

 利用函数实现加法输出的多种方式

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	/*原始输出方式*/
	int ret = Add(3, 6);
	printf("ret  = %d\n", ret);
	
	/*利用函数指针变量输出*/
	/*输出方式一*/
	int(*p1)(int, int) = &Add;
	int ret1 = Add(2,9);
	printf("ret1 = %d\n", ret1);

	/*输出方式二*/
	int(*p2)(int, int) = Add;
	int ret2 = Add(2, 8);
	printf("ret2 = %d\n", ret2);

	/*输出方式三*/
	int(*p3)(int, int) = Add;
	int ret3 = (p3)(4, 7);
	printf("ret3 = %d\n", ret3);

	return 0;
}

控制台结果输出

关于函数指针我在这篇文章中详细讲过:函数指针


 ***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。
等等等等一下,分享最近喜欢的一句话:

“知不足而奋进,望远山而前行”。

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/424902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

CKA考生注意:这些Deployment要点能助你一臂之力!

往期精彩文章 : 提升CKA考试胜算&#xff1a;一文带你全面了解RBAC权限控制&#xff01;揭秘高效运维&#xff1a;如何用kubectl top命令实时监控K8s资源使用情况&#xff1f;CKA认证必备&#xff1a;掌握k8s网络策略的关键要点提高CKA认证成功率&#xff0c;CKA真题中的节点维…

蓝桥杯集训·每日一题2024 (前缀和)

笔记&#xff1a; 例题&#xff1a; #include<bits/stdc.h> using namespace std; const int N 5000010; char str[N]; int s[N]; int main(){int t;cin>>t;for(int a1;a<t;a){int n;cin>>n;scanf("%s",str1);for(int i1;i<n;i){s[i]s[i-1]…

重磅!交通领域顶级会议TRB会议将进行重大改革

美国交通研究委员会年会&#xff08;Transportation Research Board annual meeting,以下简称TRB会议&#xff09;是由美国交通研究委员会举办的交通领域的国际顶级会议。该会议每年举办一次&#xff0c;在华盛顿特区召开。TRB会议是交通研究领域知名度最高的学术会议之一&…

AI又进化了

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 一直想做但没做的板块&#xff0c;整理一段时间内AI领域的前沿动态&#xff08;符合大多粉丝研究领域/感兴趣方向&#xff09;&#xff0c;了解了解外面世界发展成啥样了&#xff0c;一起看看吧~ 谷歌…

跟 AI 学 StarRocks:简介

因为要支持公司的 BI 建设&#xff0c;团队引入了 StarRocks 数据库&#xff0c;此前我没有了解过此项技术&#xff0c;不过因为有架构师引入了此项技术栈&#xff0c;就顺便学习一下。 一、什么是 MPP 数据库&#xff1f; MPP 数据库指的是大规模并行处理&#xff08;Massiv…

Hololens 2应用开发系列(2)——MRTK基础知识及配置文件配置(上)

Hololens 2应用开发系列&#xff08;2&#xff09;——MRTK基础知识及配置文件配置 一、前言二、MRTK基础知识2.1 MRTK概述2.2 MRTK运行逻辑2.3 MRTK配置文件介绍2.4 MRTK服务 三、配置文件使用3.1 总配置文件3.2 相机配置3.3 其他配置 参考文献 一、前言 在前面的文章中&…

DDR5 新特性概述

主页&#xff1a; 元存储博客 文章目录 前言1. SDR 与 DDR2. DDR5 的新特点总结 前言 DDR5 带来更快的处理速度和更大的存储空间&#xff0c;为云计算、大数据等领域的发展提供了强有力的支持。 1. SDR 与 DDR single data rate&#xff0c; 1 个时钟周期做一次数据传输 do…

更改elementui的箭头图片以及位置

//更改箭头位置 .el-tree-node__content > .el-tree-node__expand-icon {position: absolute;right: 12px; }//更改箭头图片 .el-tree-node__expand-icon {transform: rotate(-90deg); } .el-tree-node__expand-icon.expanded {transform: rotate(0deg); } // 有子节点 且已…

使用QEMU搭建U-Boot+LinuxKernel+busybox+NFS嵌入式开发环境

目录 0.课程大纲1.为什么要使用QEMU学习嵌入式QEMU简介使用QEMU可以做哪些事情?当前嵌入式行业现状如何适应这种变化使用QEMU学习嵌入式有哪些好处?驱动开发技能为什么要学习Linux 2.搭建嵌入式开发基本环境2.1.安装u-boot-tools2.2.安装交叉编译工具什么是ABI和EABI 3.QEMU安…

DSI2协议之BTA行为理解

概念: DSI协议spec支持总线控制权在master和slave之间发生交换,即通过bus turn around来实现; BUS TURN AROUND: BTA 的实现是通过controller—>cdphy的turnrequest信号来实现; 关于控制器发出turnrequest给phy,phy通过lvds/trio线输出turnaround sequence如下图中…

C++基于多设计模式下的同步异步日志系统day3

C基于多设计模式下的同步&异步日志系统day3 &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&am…

C习题002:澡堂洗澡

问题 输入样例 在这里给出一组输入。例如&#xff1a; 2 5 1 3 3 2 3 3 输出样例 在这里给出相应的输出。例如&#xff1a; No代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB 代码 #include<stdio.h> int main() {int N,W,s,t,p;int arr_s[…

投影和定义投影的区别

Arcmap中关于投影的工具有四个&#xff0c;分别是定义投影、投影、投影栅格、批量投影。这四个工具既有相同之处也有不同之处&#xff0c;下面我将一一介绍。 ①定义投影&#xff1a;Arcmap中关于定义投影工具是这样描述的&#xff1a;“所有地理数据集均具有一个用于显示、测…

小白必看的Python函数讲解

定义函数 我们通过斐波那契数列来理解定义函数 >>> def fib(n): # 将斐波那契数列打印到 n ... """将斐波那契数列打印到 n""" ... a, b 0, 1 ... while a < n: ... print(a, end ) ... a, b b, …

【Linux安装软件命令及vim、gcc使用说明】

安装软件命令 Linux安装软件的命令首先要进入管理员权限 首先在终端输入sudo su切换到管理员界面 输入对应的密码&#xff0c;注意这里的密码不会显示出来&#xff0c;输完密码之后回车即可。当出现root就代表已经是管理员界面了。 如果相应退出管理员界面输入exit即可。 注…

出现这6点症状,不要拖延,不然植物神经紊乱会找到你!

植物神经紊乱&#xff0c;是一种由于自主神经系统失衡引起的疾病。自主神经系统主要负责调节人体内脏器官的功能&#xff0c;包括心脏、血管、消化系统等&#xff0c;一旦失衡将导致一系列不适症状。植物神经紊乱的主要原因包括长期的焦虑、压力、过度疲劳、情绪波动、生活节奏…

从零开始的二进制漏洞挖掘(1)路由器漏洞挖掘(去实战版)

前言 路由器的洞大部分都是栈溢出&#xff0c;如果想要了解一些相关的知识&#xff0c;可以去看我的pwn和二进制安全虚拟机Protostar靶场系列文章&#xff0c;传送门&#xff1a; https://blog.csdn.net/qq_45894840/category_12002228.html?spm1001.2014.3001.5482ghidra安…

2024全新手机软件下载应用排行、平台和最新发布网站,采用响应式织梦模板

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。 主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 地 址 &#xff1a; runruncode.com/php/19703.html 软件程序演示图&#xff1a;…

领域驱动设计(Domain-Driven Design DDD)——战略设计1

一、概述 随着系统的增长&#xff0c;它会越来越复杂&#xff0c;当我们无法通过分析对象来理解系统的时候&#xff0c;就需要掌握一些操纵和理解大模型的技术了。 最负雄心的企业欲实现一个涵盖所有业务、紧密集成的系统。因大型公司的业务模型巨大且复杂&#xff0c;很难把它…