C语言指针(3)

目录

一、字符指针变量

二、数组指针变量

三、⼆维数组传参的本质

四、函数指针变量

五、typedef 关键字

六、函数指针数组


一、字符指针变量

字符指针char*

&符号名  符号名,这都是获取的是首元素地址。

int main()
{char a[] = "abcdef";char* pc = &a;*pc = 'w';return 0;
}
//输出wbcdef

char* pc = &a;获取的只是字符串的首地址,并没有获取整个数组的地址。

int main ()
{const char* pstr = "hello bit.";printf("%s\n", pstr);return 0;
}

在这一行代码中,我们是否把hello bit整个字符串地址放入到pstr指针里面了吗?并没有,pstr只是获取了字符串中首元素的地址。

我们来分析以下题目,大家可以先思考。

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");elseprintf("str1 and str2 are not same\n");if (str3 == str4)printf("str3 and str4 are same\n");elseprintf("str3 and str4 are not same\n");return 0;
}

这个题目是比较的地址是否相同。

str1与str2创建的变量不是在一个地址里面。

str3与str4因为是指针,这两个指针指向的是同一个字符串。

以上题目输出
str1 and str2 are not samestr3 and str4 are same

二、数组指针变量

指针获取的是指向类型变量的地址,指针需要获得整个数组的地址。

int* p1;//存放的是整型变量地址,能够指向整型数据的指针。char* p2;//存放的是字符变量地址,能到指向字符数据的指针。double* p3;//存放的是浮点型变脸的地址,能够指向浮点型数据的指针。

那么如何获取数组的地址并存放到指针里呢?

int main()
{int arr[5] = { 1,2,3,4,5 };int(*p)[5] = &arr;return 0;
}

在调试这段代码的时候,我们看见p已经接收了整个数组,数组的类型已经改变成int[5]*

三、⼆维数组传参的本质

void add(int arr[3][3], int r, int s)
{for (int i = 0; i < r; i++){for (int j = 0; j < s; j++){printf("%d ", arr[i][j]);}printf("\n");}
}int main()
{int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };add(arr, 3, 3);return 0;
}
//输出
1 2 3
4 5 6
7 8 9

我们以往想打印出二维数组是使用这种方法来实现打印的。

这是一个二维数组,二维数组是一个连续存放的数组,我可以把二维数组想成一条直线。

这一个3行5列的数组,arr[0]对应的是第一行首元素的地址,arr[1]对应的是第二行首元素的地址。

第一行数组指针类型是int (*)[5],每一行里有五个数

所以二维数组的本质也是传递了地址,传递的地址是一个每一行的数组地址。

void test(int(*p)[5], int r, int s)
{for (int i = 0; i < r; i++){for (int j = 0; j < s; j++){printf("%d ", (*(*p+i)+j));}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} };test(arr, 3, 5);return 0;
}
//输出
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7

void test(int* arr[5], int r, int s),每一行数组中元素的个数为5,使用int (*p)[5]是为了与二维数组‘arr’的每一行的结构匹配

四、函数指针变量

创建一个指针,指针指向的是一个函数。

int add(int x, int y)
{return x + y;
}int main()
{int sz = add(3, 5);printf("%d\n", sz);return 0;
}

在以前我们都是直接把函数给传参过去。

int add(int x, int y)
{return x + y;
}int main()
{int (*p)(int x, int y) = add;printf("%d\n", p(3,5));return 0;
}
//输出
8

int (*p)(int x, int y) = add;   p中存放了函数add的地址,我们就可以通过p直接使用add函数。

int (*)(int x, int y)
int (*)(int, int)
函数指针以上两种写法都可以,看函数需要什么类型的参数。
int add(int x, int y)
{return x + y;
}int main()
{int (*p)(int x, int y) = add;printf("%d\n", p(3,5));printf("%d\n", (*p)(4, 6));return 0;
}
//输出
8   
10以下两种写法都是可以的,推荐使用第一种写法,看起来比较清晰
printf("%d\n", p(3,5));
printf("%d\n", (*p)(4, 6));

五、typedef 关键字

typedef可以讲类型重命名,可以把复杂类型简化成简单。

typedef unsigned int uint;int main()
{unsigned int a = 10;uint b = 30;return;
}
在这段代码中,把unsigned int给重命名uint。可以把int*给重命名
typedef int* test;int(*)[5]也可以给重命名
typedef int(*add)[10];
我们给重命名add,在数组指针里,我们需要在*的右边命名。int (*)(int,int)同样也能重命名
typedef int(*fun)(int,int);
把int (*)(int,int)给重命名了fun,函数指针跟数组指针一样,都要把重新命名的名字写在*旁边

六、函数指针数组

函数指针数组是把指向函数的指针放一个数组里面里面,创建一个指针指向这个数组。

int add(int x, int t)
{return x + y;
}int sub(int x, int t)
{return x - y;
}int mul(int x, int t)
{return x * y;
}int div(int x, int t)
{return x / y;
}int main()
{int (*p[5])(int, int) = { add,sub,mul,div };return 0;
}

int (*p[5])(int, int) = { add,sub,mul,div };这一行代码就是函数指针数组,使用了我们前面学习的函数指针,指针数组,

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

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

相关文章

另一棵树的子树 - 力扣(LeetCode)C语言

572. 另一棵树的子树 - 力扣&#xff08;LeetCode&#xff09;&#xff08;点击前面链接即可查看题目&#xff09; 一、题目 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&…

机器学习中的关键距离度量及其应用

引言 在当今的数据驱动世界中&#xff0c;机器学习算法扮演着至关重要的角色&#xff0c;它们在图像分类、面部识别、在线内容审核、零售目录优化和推荐系统等多个领域发挥着重要作用。这些算法的核心在于它们能够识别和利用数据之间的相似性。而实现这一点的关键&#xff0c;…

ShardingSphere 内核工作原理

文章目录 内核工作原理配置管控SQL Parser: SQL解析引擎SQL Router- SQL 路由引擎SQL Rewriter : SQL 优化引擎SQL Executor &#xff1a; SQL执行引擎Result Merger&#xff1a; 结果归并 内核工作原理 ShardingSphere的整体架构图是这样的&#xff1a; 配置管控 在进入Shar…

MySQL事务,锁,MVCC总结

mysql中最重要的就是事务&#xff0c;其四大特性让我们维持了数据的平衡&#xff0c;一致。那么事务究竟是什么&#xff0c;与什么相关&#xff0c;他的使用步骤&#xff0c;以及使用过程中我们会遇到什么问题呢&#xff1f;下面我们一起学习交流! 1.MySQL的存储引擎&#xff…

SPIFFS与LittleFS的对gz文件格式的区别

SPIFFS 只能安装在Arduino上。LittleFS支持Arduino IDE和VScode的 PlatformIO。 SPIFFS serveStatic: server.serveStatic("/", SPIFFS, "/") 负责提供 SPIFFS 文件系统中的文件。您可以在 SPIFFS 上放置 .gz 文件&#xff0c;并该方法将自动处理它们。 …

git cz代码提交规范,适用于node14以上

1.效果 3. 在项目中如何添加 3.1 安装(只提供npm安装方式)全局安装 commitizen npm i -D commitlint commitlint/config-conventional commitizen cz-git 3.2 配置模版 在项目的根目录下配置添加文件 commitlint.config.js 并写入如下代码 /** type {import(cz-git).UserCo…

C# 类型转换

隐式&#xff08;implicit&#xff09;类型转换 1.不丢失精度的转换 2.显示&#xff08;explicit&#xff09;类型的转换 有可能丢失精度的转换 使用convert转换 ToString方法&#xff1a;将数值类型转换成字符串型

PDF密码移除技巧: 五大 PDF 密码移除器

如果您想解密或删除 PDF 密码&#xff0c;该怎么办&#xff1f;PDF 是一种经常用于商业的格式&#xff0c;您可以在培训、教育和商业场合使用它。添加这些 PDF 文件的密码可以保护您的安全和隐私。因此&#xff0c;有很多 PDF 都用密码加密&#xff0c;当您想要查看这些 PDF 时…

吃透张宇1000题和660题,能保底100分吗?

暑假已经过一半了&#xff0c;很多人都在埋头做题&#xff0c;如果你选择的是1000题660题 一定要好好看这篇笔记&#xff01; 因为很多人做题做到现在&#xff0c;有点迷茫 主要的迷茫点有三个&#xff1a; 1、为什么1000题和660题也都做不少了&#xff0c;遇到新题&#x…

RS485 芯片SN65HVD72DR导致的死机问题调试

最近再一次栽倒在这颗RS485 芯片上了&#xff0c;硬件说这和芯片功耗有点高&#xff0c;要控下电源, 结果10次有9次程序死机&#xff01; 先上图&#xff0c;请各位高手看看&#xff0c;这电路有问题没有&#xff1f; 为什么我会说是RS485 芯片导致的死机&#xff1f;因为 只要…

ai自动配音工具

AI拟音大师&#xff0c;给你的无声视频添加生动而且同步的音效 &#x1f61d;文件夹是一种基于文本的视频到音频生成框架,可以生成高质量的音频,在语义上相关,并与输入视频时间同步。 下载地址&#xff1a;https://pan.quark.cn/s/5a2be1cc5551

被工信部认可的开源软件治理解决方案

近日&#xff0c;工信部网络安全产业发展中心正式发布了“2023年信息技术应用创新解决方案”&#xff0c;开源网安凭借“基于SCA技术开源软件治理解决方案”顺利入选&#xff0c;成为经工信部认可的优秀解决方案&#xff0c;这是开源网安连续两届荣获此荣誉。 工业和信息化部网…

基于强化学习的Deep-Qlearning网络玩cartpole游戏

1、环境准备&#xff0c;gym的版本为0.26.2 2、编写网络代码 # 导入必要的库 import gym import torch import torch.nn as nn import torch.optim as optim import numpy as np from collections import deque import random# 定义DQN网络 class DQN(nn.Module):def __init__…

基于web的购物网站的设计与实现(系统源码+lw+部署文档+讲解等)

文字目录&#xff1a; 目录 详细视频演示 系统实现界面 1.1系统开发环境以及运行环境 1.1.1系统开发环境 1.1.2系统运行环境 1.2系统功能实现 1.3管理员模块实现 2 技术介绍 2.1 thinkphp5介绍 2.2 MySQL数据库 2.3 B/S结构 4.1系统结构设计 4.2系统功能结构设计…

如何挑选理想的报表工具?从入门到专业,测评十大热门工具的优缺点

报表能够用表格和图表等格式动态显示数据&#xff0c;因此衍生出相应的报表工具&#xff0c;已经有20年以上的发展历史了&#xff0c;期间报表工具不断随着需求的改变而更新迭代&#xff0c;今天博主就来推荐十款实用的报表工具&#xff0c;祝你轻松解决烦人的中国式复杂报表。…

【MySQL进阶】MySQL主从复制

目录 MySQL主从复制 概念 主从形式 一主多从 多主一从 双主复制 主从级联复制 主从复制原理 三个线程 两个日志文件 主从复制的主要工作模式 异步复制 半同步复制 全同步复制 MySQL主从复制 概念 MySQL主从复制是一种数据分布机制&#xff0c;允许从一个数据库服…

32.x86游戏实战-使用物品call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【TDH社区版大事件】图分析、全文检索、小文件治理、数据开发工具通通都有!

星环科技大数据基础平台TDH社区版&#xff0c;在保留了商业版核心技术优势的基础上最大程度地降低了用户使用大数据技术的门槛与成本&#xff0c;具有更轻量、更简单、更易用等特性。 此次TDH社区开发版、社区版、社区订阅版均发布了新版本&#xff0c;带来新的产品组件和新的…

前端学鸿蒙有必要么?

在当今科技飞速发展的时代&#xff0c;前端开发领域也在不断演进和变革。那么&#xff0c;对于前端开发者来说&#xff0c;学习鸿蒙是否有必要呢? 一、前端学鸿蒙的必要性分析 1、鸿蒙开发简介 鸿蒙操作系统(HarmonyOS)是一个面向全场景的分布式操作系统&#xff0c;它不仅支持…

SX_c语言字符带空格字符串读写_9

改项目的时候又发现c语言读字符串的一些细节这里做补充其中%[^\n]可以读取带空格的字符串 #include <stdio.h>int main(){char cmd;scanf("%c", &cmd);char time[32] {0};scanf("%s", time);printf("%c\n", cmd);printf("%s&quo…