C 深入指针(4)

目录

一、字符指针变量

1 初始化

2 与字符串数组的区别

二、数组指针变量 

1 初始化

2 二维数组传参本质

三、函数指针变量

1 初始化

2 用法 

四、typedef关键字

五、函数指针数组


一、字符指针变量

1 初始化

//VS2022 x64
#include <stdio.h>
int main()
{char* p = 'w';	//字符指针变量char* pc = "abcdef";	//pc 里存放的是字符串首元素的地址printf("%s", pc);	//输出 abcdefreturn 0;
}

2 与字符串数组的区别

#include <stdio.h>
int main()
{char arr1[] = "abcd";char arr2[] = "abcd";char* pc1 = "abcd";char* pc2 = "abcd";if (arr1 == arr2)    //判断存储的地址是否一样printf("arr1 和 arr2 一样\n");elseprintf("arr1 和 arr2 不一样\n");if(pc1 == pc2)    //判断存储的地址是否一样printf("pc1 和 pc2 一样\n");elseprintf("pc1 和 pc2 不一样\n");return 0;
}//输出
//arr1 和 arr2 不一样
//pc1 和 pc2 一样

 


二、数组指针变量 

1 初始化

#include <stdio.h>
int	main()
{//类比一下//整型指针变量int a = 10;int* p1 = &a;	//指针类型:int*int arr[5] = { 0,1,2,3,4 };//整型指针变量int* p = arr;	//指针类型:int* 指向数组首元素地址//数组指针变量int(*p)[5] = &arr;	//指针类型:int(*)[5] 指向整个数组地址return 0;
}

2 二维数组传参本质

原来的格式

#include <stdio.h>
void func(int arr[3][3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", arr[i][j]);}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr);	//传的是数组首元素地址return 0;
}

根据数组名是数组首元素的地址这个规则,二维数组的数组名表示的就是第一行的地址,是一维数组的地址。根据上面的例子,第一行的一维数组的类型就是 int[3] ,所以第一行的地址的类型就是数组指针类型 int(*)[3] 。那就意味着二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的。 

void func(int (*p)[3])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 3; j++){printf("%d ", p[i][j]);	//等同于*( *(p + i) + j)}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{2,3,4},{3,4,5} };func(arr);return 0;
}

三、函数指针变量

1 初始化

函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址。

#include <stdio.h>
int Add(int a,int b)
{return a + b;
}int main()
{int a = 0;int b = 0;Add(a,b);int (*p1)(int, int) = &Add;int (*p2)(int,int) = Add;printf("%p\n", p1);printf("%p\n", p2);return 0;
}//输出
//00007FF6EA2413CA
//00007FF6EA2413CA

2 用法 

通过函数指针调用指针指向的函数

#include <stdio.h>
int Add(int a, int b)
{return a + b;
}int main()
{int a = 5;int b = 5;int (*p1)(int, int) = Add;printf("%d\n", p1(a, b));    //等同于Add(a, b)return 0;
}//输出
//10

四、typedef关键字

typedef 是用来类型重命名的,可以将复杂的类型,简单化

//将 unsigned int 重命名为 uint
typedef unsigned int uint;

但是对于数组指针和函数指针稍微有点区别:新的类型名必须在 * 的右边

//将 int(*)[5] 重命名为 pa_int
typedef int(*pa_int)[5];
//将 int(*)(int, int) 重命名为pf_int
typedef int(*pf_int)(int, int);

五、函数指针数组

存放指针的数组称为指针数组,存放函数指针的数组称为函数指针数组

int(*pf[3])(int, int);

pf 先和 [ ] 结合,说明 pf 是数组,数组的内容是 int (*)(int, int) 类型的函数指针。


完 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人非线性阻抗控制系统

机器人非线性控制系统本质上是一个复杂的控制系统&#xff0c;其状态变量和输出变量相对于输入变量的运动特性不能用线性关系来描述。这种系统的形成基于两类原因&#xff1a;一是被控系统中包含有不能忽略的非线性因素&#xff0c;二是为提高控制性能或简化控制系统结构而人为…

人形机器人场景应用全解析,2024睿抗 AI ROBOT创新挑战赛火热报名中!

人工智能&#xff08;AI&#xff09;已成为推动科技革命和产业变革的关键力量。随着大模型等AIGC技术的迅猛发展&#xff0c;AI正深刻改变我们的生活并重新定义生产方式。越来越多人期望将AI技术从纯粹的思维和计算扩展到与物理世界的互动中&#xff0c;即发展具身智能。 为了推…

探索中国文本到视频AI模型——Vidu

引言 随着人工智能技术的不断进步&#xff0c;我们见证了从文本到视频内容生成的革命。最近&#xff0c;一个名为Vidu的中国文本到视频AI模型引起了全球的关注。由清华大学和中国AI初创公司声书科技联合开发的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它声称能够生成高…

测试周期记录

测试周期是软件开发生命周期中的一个重要环节&#xff0c;它包括单元测试、集成测试、系统测试和验收测试等阶段。本文将详细介绍测试周期的各个阶段及其重要性&#xff0c;帮助读者更好地理解测试周期在软件开发过程中的作用。 一、单元测试 单元测试是测试周期中的第一个阶段…

个人工控方面收藏网址记录(持续更新中)

1、OPC类 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物联网IoT协议之OPC UA快速入门教程 | 源码先生的调试人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根据集群具体数量修改pod数&#xff0c;官方推荐比例为5/1&#xff0c;即有15台服务器最好是3个pod。 2.coredns会继承pod所在主机的dns解析,修改了主机的dns解析之后&#xff0c;coredns有一段时间的缓存&#xff0c;重启coredns才会在集群内部立刻生效该解析。 …

SpringBoot3集成WebSocket

标签&#xff1a;WebSocket&#xff0c;Session&#xff0c;Postman。 一、简介 WebSocket通过一个TCP连接在客户端和服务器之间建立一个全双工、双向的通信通道&#xff0c;使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据&#xf…

003_PyCharm的安装与使用

如果你正在学习PyQt&#xff0c;本系列教程完全可以带你入门直至入土。 所谓从零开始&#xff0c;就是从软件安装、环境配置开始。 不跳过一个细节&#xff0c;不漏掉一行代码&#xff0c;不省略一个例图。 IDE 开始学习一个编程语言&#xff0c;我们肯定是首先得安装好它&…

std::funture和std::promise

#include <iostream> #include <thread> #include <future>void calculateResult(std::promise<int>& promiseObj) {// 模拟耗时计算std::this_thread::sleep_for(std::chrono::seconds(2));// 设置结果到 promise 中promiseObj.set_value(42); }i…

信息系统项目管理师——十大管理过程输入、工具和技术、输出(论文篇)二

六、项目风险管理 规划风险管理 在撰写关于“规划风险管理”的论文时&#xff0c;这个过程是项目风险管理的第一步&#xff0c;旨在建立风险管理的框架&#xff0c;为整个项目周期内的风险识别、分析、应对和监控奠定基础。以下是规划风险管理过程中可能涉及的输入、工具和技…

Python学习(五)异常处理

异常概念 异常的捕获方法 try: f open("D:/abc.txt","r",encoding"UTF-8") except: print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开") f open("D:/abc.txt&qu…

Python代码:十、字符串连接

1、题目 小明有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依次连接在一个字符串中输出。 2、代码 import sysstr1 input() str2 input() str3 str1 str2 pr…

从0到1:使用HuggingFace的管线加载Diffusion模型生成第一张图像!

Hugging Face系列1&#xff1a;详细剖析Hugging Face网站资源 前言本篇摘要1. Hugging Face Hub三大件1.1 模型1.1.1 模型简介1.1.2 制作模型卡片1.1.3 模型下载和上传1.1.4 模型应用 1.2 数据集1.2.1 数据集简介1.2.2 调用代码1.2.3 AutoTrain在线微调 1.3 Space应用1.3.1 内容…

理解 Python 中的 `super()` 与 `__init__()` 方法

在 Python 的面向对象编程中&#xff0c;super() 函数和 __init__() 方法是两个非常重要的概念。它们在类的继承和初始化过程中扮演着关键的角色。本文将深入探讨这两个概念的工作原理&#xff0c;并通过示例代码来展示它们的使用。 基本原理 __init__() 方法 __init__() 是…

Vue中的全局事件总线:EventBus与$bus的比较详解与实战应用

EventBus实例&#xff1a; var EventBus new Vue() 会创建一个名为EventBus的Vue实例&#xff0c;并将其存储在变量EventBus中。Vue.prototype.$bus new Vue() 则直接在Vue的原型上创建一个新的Vue实例&#xff0c;并将其赋值给$bus属性。 使用方式&#xff1a; var EventBus…

C# 结合 JavaScript 对 Web 控件进行数据输入验证

目录 关于数据验证 范例运行环境 验证设计 JavaScript 方法 设计 实现 调用示例 C# 方法 设计 实现 调用示例 小结 关于数据验证 在 Web 应用的录入界面&#xff0c;数据验证是一项重要的实现功能&#xff0c;数据验证是指确认 Web 控件输入或选择的数据&#xff…

类对象作为类成员

在C中&#xff0c;类对象可以作为另一个类的成员变量。这种设计方式可以用于创建复杂的对象结构&#xff0c;使得一个类的对象能够包含另一个类的对象。这种嵌套类的组合方式可以增强代码的可重用性和模块化。 类对象作为类成员的示例 让我们通过一个示例来解释这一概念。假设…

武汉信息系统建设和服务能力评估CS认证咨询

很多企业在咨询信息系统建设和服务能力评估的时候喜欢百度搜索&#xff0c;不管是本地咨询机构还是外地咨询机构只要价格便宜就找谁&#xff0c;这个在低等级的CS1是可以这么操作的&#xff0c;一旦上升到CS2级别及以上的&#xff0c;我们一般不推荐找外地咨询机构&#xff0c;…

【文末附gpt升级方案】字节跳动发布豆包大模型:AI领域的革新与引领

随着科技的飞速进步&#xff0c;人工智能&#xff08;AI&#xff09;已逐渐成为推动社会发展的重要力量。在这一背景下&#xff0c;字节跳动公司以其前瞻性的眼光和创新能力&#xff0c;于XXXX年XX月XX日正式发布了豆包大模型&#xff0c;这一举动无疑在AI领域掀起了新一轮的浪…

C语言.动态内存管理

动态内存管理 1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free 3.calloc和realloc3.1calloc3.2realloc 4.常见的动态内存管理的错误4.1对NULL指针解引用操作4.2对动态开辟空间的越界访问4.3对非动态开辟内存使用free释放4.4使用free释放一块动态开辟内存的一部分4.5对…