指针进阶详解
个人主页:点我进入主页
专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶
欢迎大家点赞,评论,收藏。
一起努力,一起奔赴大厂。
目录
1.字符指针
2.指针数组
3.数组指针
4.数组传参和指针传参
4.一维数组传参
4.2二维数组传参
4.3一级指针传参
4.4二级指针传参
5.函数指针
今天我主要给大家带来的是关于指针进阶的部分,对于指针初阶还有疑问的小伙伴们可以点击指针的部分应用和指针基础进行学习,经过初阶指针的学习我们知道指针就是一个变量,是用来存放地址的;指针的大小在不同机器中也不相同,在32位机器中占用4个字节,在64位机器中占用8个字节;指针是有类型的;指针的运算等知识,今天主要学习的是字符指针,数组指针,指针数组,数组传参和指针传参,函数指针这几部分。
1.字符指针
整形指针是指整形的指针,那么我们可以认为字符指针是指字符类型的指针,具体的表达方式我们看以下代码:
#include<stdio.h>
int main()
{char a = 'A';char* p = &a;char arr[] = "abcdef";const char* q = arr;printf("%c", "abcdef"[0]);*q = 'q';return 0;
}
其中p就是一个字符指针。我们对于一个字符串我们想要用指针指向一个字符串时我们最好使用一个const进行修饰,原因是我们使用指针时就会想让字符串的是否能改变它的值,也就是*q='q'这一句,我们知道字符串初始化后只能通过strcpy函数进行修改,所以我们在定义字符指针时用const进行修饰,一旦我们修改它的值就会报错,让我们很容易找到问题的所在地。(字符指针可以看成整形指针,这两种指针的主要区别就是他们的类型)
2.指针数组
整形指针————指向整形数据的指针
字符指针————指向字符数据的指针
指针数组————指向指针的数组
指针数组是数组中存放的地址,例如代码:
#include<stdio.h>
int main()
{int arr1[4] = {0,1,2,3};int arr2[4] = { 1,2,3,4 };int arr3[4] = { 2,3,4,5 };int* arr[3] = { arr1,arr2,arr3 };int i, j;for (i=0;i<3;i++){for (j = 0; j < 4; j++){printf("%d ", arr[i][j]);}}return 0;
}
指针数组的主要作用就是用于创建二维数组。
3.数组指针
指针数组————指向指针的数组
数组指针————指向数组的指针
我们知道数组名是数组的首地址,但是有一些例外,例如sizeof(arr)这句代码中arr是数组的地址,还有另一种,我们代码如下:
#include<stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4};printf("%p\n", arr);printf("%p\n", arr + 1);printf("%p\n", &arr[0]);printf("%p\n", &arr[0]+1);printf("%p\n", &arr);printf("%p\n", &arr+1);return 0;
}
当我们运行代码可以看到

&arr+1和&arr相差40个字节 ,其余的arr和arr+1,&arr[0]+1和&arr[0]相差4个字节,我们可以得到&arr得到的是数组的地址,arr和&arr[0]是数组的首地址。数组指针具体是如何使用的,我们可以看以下代码:
#include <stdio.h>
int main()
{int arr[5] = { 0,1,2,3,4 };int(*p)[5] = &arr;int i;for (i = 0; i < 5; i++){printf("%d ", (*p)[i]);}return 0;
}
我们用的是数组指针,他需要包括指针和数组,*p是指针【5】是数组,那问题来了*p[5]是否可行呢,答案是不可,我们知道【】的优先级高于*所以p会先和【5】结合就又成了指针数组。
4.数组传参和指针传参
4.一维数组传参
我们先看一维数组传参,代码如下:
#include <stdio.h>
void print(int arr[], int sz)
{int i;for (i = 0; i < sz; i++)printf("%d ", arr[i]);
}
int main()
{int arr[5] = { 0,1,2,3,4 };print(arr,5);
}
在形参中可以写成arr[],也可以写成arr[5];
4.2二维数组传参
代码如下:
#include <stdio.h>
void print(int arr[3][2], int sz1,int sz2)
{int i,j;for (i = 0; i < sz1; i++){for(j=0;j<sz2;j++)printf("%d ", arr[i][j]);}
}
int main()
{int arr[3][2] = { {0,1},{1,2},{2,3} };print(arr,3,2);
}
我们知道在二维数组传参时行可以省略,列不可以省略,因此我们还可以吧形参写为arr[][2]。
4.3一级指针传参
#include <stdio.h>
void print(int *p, int sz)
{int i;for (i = 0; i < sz; i++)printf("%d ", *(p+i));
}
int main()
{int arr[5] = { 0,1,2,3,4 };print(arr,5);
}
我们可以看到一维数组传参和指针传参基本相同
4.4二级指针传参
代码如下;
#include <stdio.h>
void print(int** pp)
{printf("%d", **pp);
}
int main()
{int a = 10;int* p = &a;print(&p);return 0;
}
5.函数指针
数组指针————指向数组的指针
函数指针————指向函数的指针
#include <stdio.h>
int Add(int a, int b)
{return a + b;
}
int main()
{int a = 10;int b = 20;printf("a + b = %d\n", Add(a, b));printf("&Add = %p\n", &Add);printf(" Add = %p\n", Add);return 0;
}
我们知道函数也是有地址的我们&Add可以得到函数的地址,我们想到取地址数组名是数组的地址和取地址函数名是函数的地址,那数组名是数组的首地址,函数名是不是函数的首地址呢?事实上函数没有首地址,它的函数名就是函数的地址和取地址函数名是一个意思,那什么是函数指针呢?我们知道数组指针的形式是(*p)[5]的形式那函数指针就是void(*p)(int ,char)的形式其中int ,char是形参的数据类型,void是函数的返回类型。
我们看两段有趣的代码
(*(void (*)())0)()
其中void (*)()是函数指针,(void (*)())0是强制转换(*()0)()相当于调用0地址的函数。void (*signal(int , void(*)(int)))(int);
void(*)(int)是函数指针,signal(int , void(*)(int))是一个函数一个参数是int类型,一个是函数指针类型,void(*signal())(int)是指signal函数返回类型是void,参数是int,
今天的内容就结束了,希望大家可以点赞,评论,收藏。
相关文章:
指针进阶详解
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.字符指针 2.指针数组 3.数组指针 4.数组传…...
QGIS 如何添加天地图
相信很多小伙伴在 QGIS 里面添加天地图的时候一定感觉很困惑,按照官网的操作申请 Key 之后,添加相对应的服务地址之后看不到地图或者地图不正常显示,今天我们就来解决这个问题 以下所有操作基于 QGIS 3.22 版本 申请 Key 1. 添加天地图的第一步需要申请 Key,首先要注册天…...
PHP8内置函数中的数学函数-PHP8知识详解
php8中提供了大量的内置函数,以便程序员直接使用常见的内置函数包括数学函数、变量函数、字符串函数、时间和日期函数等。今天介绍内置函数中的数学函数。 本文讲到了数学函数中的随机数函数rand()、舍去法取整函数floor()、向上取整函数 ceil()、对浮点数进行四舍…...
云计算企业私有云平台建设方案PPT
导读:原文《云计算企业私有云平台建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发本文,…...
ORA-01174: DB_FILES be compatible RAC rolling fashion complete outage
How to change the DB_FILES parameter in RAC (Doc ID 1636681.1)编辑To Bottom In this Document Goal Solution APPLIES TO: Oracle Database - Enterprise Edition - Version 10.1.0.2 and later Oracle Database Cloud Schema Service - Version N/A and later Oracle…...
线性代数(五) 线性空间
前言 《线性代数(三) 线性方程组&向量空间》我通过解线性方程组的方式去理解线性空间。此章从另一个角度去理解 空间是什么 大家较熟悉的:平面直角坐标系是最常见的二维空间 空间由无穷多个坐标点组成 每个坐标点就是一个向量 反过来,也可说&…...
kafka--技术文档--spring-boot集成基础简单使用
阿丹: 查阅了很多资料了解到,使用了spring-boot中整合的kafka的使用是被封装好的。也就是说这些使用其实和在linux中的使用kafka代码的使用其实没有太大关系。但是逻辑是一样的。这点要注意! 使用spring-boot整合kafka 1、导入依赖 核心配…...
【核磁共振成像】部分傅里叶重建
目录 一、部分傅里叶重建二、部分傅里叶重建算法2.1 填零2.2 零差处理 一、部分傅里叶重建 在部分傅里叶采集中,数据并不是绕K空间中心对称收集的,而是K空间的一半是完全填充的,另一半只收集了一小部分数据。 部分傅里叶采集所依据的原理…...
React中的flushSync与Vue中的nextTick的比较
React中的flushSync与Vue中的nextTick是两种用于处理异步更新的机制。它们在React和Vue这两个流行的前端框架中起着重要的作用。 首先,让我们来看看flushSync。在React中,当需要更新UI时,React会将更新操作放入一个队列中,然后异…...
golang设置国内镜像源
以windows为例, 在cmd 窗口中执行下列语句 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.io,direct 或者 1.运行 go env -w GO111MODULEon //开启mod 运行 go env -w GOPROXYhttps://goproxy.cn,direct //设置代理 执…...
linux切换到root没有conda环境
这个错是因为 没有将anaconda添加到环境变量 export PATH"/home/tao/anaconda3/bin:$PATH"然后 source ~/.bashrc或者写入 nano ~/.bashrc在文件的末尾添加以下行 export PATH"/home/tao/anaconda3/bin:$PATH"再 source ~/.bashrc就可以了...
数据库——redis介绍
文章目录 redis是什么?分布式缓存常见的技术选型方案有哪些?说一下 Redis 和 Memcached 的区别和共同点? redis是什么? 简单来说 Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在…...
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
目录 1. 可变参数模板 1.1 展开参数包 1.1.1 递归函数方式展开 1.1.2 逗号表达式展开 1.2 emplace相关接口 2. lambda表达式(匿名函数) 2.1 C11之前函数的缺陷 2.2 lambda表达式语法 2.3 函数对象与lambda表达式 3. 包装器 3.1 function包装器…...
喜报|星瑞格荣获“2022-2023年度国产数据库应用优秀解决方案”奖项
近日,赛迪网为表彰数字赛道上的先行者,联合《数字经济》杂志社和北京科创互联,共同组织以“树立行业标杆,引领服务创新”为中心的“2022-2023年度产业数字服务案例及创新成果征集活动”。该活动旨在鼓励各行业数字化应用技术创新树…...
【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式
【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式 文章目录 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式一、概述二、什么是幂等性三、幂等性需关注几个重点四、幂等性有什么用五、常见用来保证幂等的手段5.1 MVCC方案5.2 去重表5.3 去重表5.4 select in…...
2023.8.26-2023.9.3 周报【3D+GAN+Diffusion基础知识+训练测试】
目录 学习目标 学习内容 学习时间 学习产出 学习目标 1. 3D方向的基础知识 2. 图像生成的基础知识(GAN \ Diffusion) 3. 训练测试GAN和Diffusion 学习内容 1. 斯坦福cv课程-3D (网课含PPT) 2. sjtu生成模型课件 3. ge…...
如何使用CSS创建渐变阴影?
随着网络的不断发展,制作漂亮的 UI 是提高客户在网站上的参与度的最重要的工作之一。改善前端外观的方法之一是在 CSS 中应用渐变阴影。应用渐变阴影的两种最重要的方法是线性渐变和径向渐变。 渐变阴影可用于吸引用户对特定信息的注意力,应用悬停或焦点…...
perl send HTTP Request
perl send HTTP Request 使用Perl进行发送HttP请求 use LWP::UserAgent; use HTTP::Request; use HTTP::Headers; use JSON::PP;my $test_url "htttp://127.0.0.1:8080/update/";sub sendHttp{my $user_agent LWP::UserAgent->new(timeout>60);my ($url, $…...
阿里云CDN缓存预热与刷新以及常见的故障汇总
文章目录 1.为CDN缓存的文件增加过期时间2.CDN缓存预热配置3.CDN缓存刷新配置4.常见故障 CDN缓存预热指的是主动将要缓存的文件推送到全国各地的CDN边缘加速器上,减少回源率,提供命中率。 缓存刷新指的是后期上传了同名的文件,之前的缓存已经…...
Oracle创建控制列表ACL(Access Control List)
Oracle创建控制列表ACL(Access Control List) Oracle ACL简介一、先登陆163邮箱设置开启SMTP。二、Oracle ACL控制列表处理(一)创建ACL(create_acl)(二)添加ACL权限(add_…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
