进阶C语言-指针的进阶(上)

指针的进阶
- 📖1.字符指针
- 📖2.指针数组
- 📖3.数组指针
- 🎈3.1 数组指针的定义
- 🎈3.2 &数组名VS数组名
- 🎈3.3 数组指针的使用
- 📖4.数组参数、指针参数
- 🎈4.1一维数组传参
- 🎈4.2二维数组传参
- 🎈4.3一级指针传参
- 🎈4.4二级指针传参
通过前面的学习,我们了解了指针的概念:
- 指针变量就是一个变量,用来存放地址,地址唯一标识一块内存空间。
- 指针的大小是固定为
4/8个字节(32位平台/64位平台)。 - 指针是有类型的,指针的类型决定了指针的±整数的步长,指针解引用操作的时候的权限。
- 指针的运算。
📖1.字符指针
🔭在指针的类型中我们知道有一种指针类型为字符指针 char*
#include <stdio.h>
int main()
{char ch = 'w';char* pc = &ch;const char* p = "abcdef";//这里不是将字符串全部赋给p,而是将字符串首字符的地址赋给pprintf("%s\n", p);//相当于char arr[] = "abcdef";return 0;
}

🎈下面,我们来看一道题:
#include <stdio.h>
int main()
{char str1[] = "hello world.";char str2[] = "hello world.";const char* str3 = "hello world.";const char* str4 = "hello world.";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;
}
📖图解:

✅运行结果:

📖2.指针数组
指针数组是数组。
字符数组-存放字符的数组。
整型数组-存放整型的数组。
指针数组-存放指针的数组,存放在数组中的元素都是指针类型。
//可以使用指针数组模拟一个二维数组
#include <stdio.h>
int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* arr[] = { arr1,arr2,arr3 };// int * int * int *int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

//指针数组存放多个字符串:
#include <stdio.h>
int main()
{char* arr[5] = { "hello world","nihao","hehe","C","C++" };int i = 0;for (i = 0; i < 5; i++){printf("%s\n", arr[i]);}return 0;
}

📖3.数组指针
🎈3.1 数组指针的定义
数组指针是指针还是数组?
🏆答案是指针!
字符指针-指向字符的指针。
整型指针-指向整型的指针。
浮点型指针-指向浮点型的指针。
那么数组指针就是指向数组的指针。
🎈3.2 &数组名VS数组名
//对数组名的理解
//数组名是数组首元素的地址
//但存在两个例外:
//1.sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节。
//2.&数组名,这里的数组名表示整个数组,取出的是数组的地址。
#include <stdio.h>
int main()
{int arr[10];printf("%p\n", arr);//int *printf("%p\n", arr+1);printf("%p\n", &arr);printf("%p\n", &arr+1);printf("%p\n", &arr[0]);//int *printf("%p\n", &arr[0]+1);return 0;
}

❗这里要注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。
#include <stdio.h>
int main()
{int arr[10] = { 0 };int(*p)[10] = &arr;//p是用来存放数组的指针,是数组指针char* arr2[5];char* (*pc)[5] = &arr2;int arr3[] = { 1,2,3 };int(*pv)[3] = &arr3;//[]中不能为空return 0;
}
🎈3.3 数组指针的使用
🔭关于一维数组:
#include <stdio.h>
void print(int* arr, int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0;
}

#include <stdio.h>
void print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}
}
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0;
}

🔭关于二维数组(数组指针更多的应用于二维数组):
#include <stdio.h>
void print(int arr[3][5], int r,int c)
{int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", arr[i][j]);}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5 },{ 6, 7, 8, 9, 10},{3,4,5,6,7} };print(arr, 3, 5);//arr是二维数组的数组名,是首元素的地址,是第一行元素的地址return 0;
}

#include <stdio.h>
void print(int (*p)[5], int r, int c)
{int i = 0;for (i = 0; i < 3; i++){int j = 0;for (j = 0; j < 5; j++){printf("%d ", p[i][j]);}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5 },{ 6, 7, 8, 9, 10},{3,4,5,6,7} };print(arr, 3, 5);return 0;
}

📝学了指针数组和数组指针我们来一起回顾并看看下面代码的意思:
int arr[5];//arr是一个能够存放5个整型数据的数组
int *parr1[10];//parr1是一个数组,数组有10个元素,每个元素的类型是int*
int (*parr2)[10];//parr2是一个指针,该指针是指向数值的,指向的数组有10个元素,每个元素的类型是int
int (*parr3[10])[5];//parr3是一个数组,是存放数组指针的数组,这个数组有10个元素,存放的这个数组指针指向的数组有5个元素,每个元素是int类型。
📖4.数组参数、指针参数
🎈4.1一维数组传参
#include <stdio.h>
void test(int arr[])//ok数组传参,形参可以写成数组的形式
//数组传参的本质就是传递了数组首元素的地址
{}
void test(int arr[10])//ok
{}
void test(int *arr)//ok数组传参,形式也可以是指针
{}
void test2(int *arr[20])//ok
{}
void test2(int **arr)//ok
{}
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
}
🎈4.2二维数组传参
void test(int arr[3][5])//ok
{}
void test(int arr[][])//不可以省略第二个[]里的数字
{}
//行可以省略,列不能省略
void test(int arr[][5])//ok
{}
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
//这样才方便运算。
void test(int *arr)//不行
{}
void test(int* arr[5])//不行
{}
void test(int (*arr)[5])//ok
{}
void test(int **arr)//不行
{}
int main()
{
int arr[3][5] = {0};
test(arr);
}
🎈4.3一级指针传参
#include <stdio.h>
//一级指针传参,形参部分写成一级指针就可以了
void print(int *p, int sz)
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d\n", *(p+i));
}
}
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9};
int *p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
//一级指针p,传给函数
print(p, sz);
return 0;
}
🔭当一个函数的参数部分为一级指针的时候,函数能接受什么参数?
#include <stdio.h>
void test(int* p)
{
}
int main()
{int a = 0;int* ptr = &a;int arr[5];test(arr);//传整型一维数组的数组名test(&a);//传整型变量的地址test(ptr);//传整型指针return 0;
}
🎈4.4二级指针传参
#include <stdio.h>
void test(int** ptr)
{
printf("num = %d\n", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}
🔭当函数的参数为二级指针的时候,可以接收什么参数:
void test(char **p)
{ }
int main()
{
char c = 'b';
char*pc = &c;
char**ppc = &pc;
char* arr[10];
test(&pc);
test(ppc);
test(arr);//Ok
return 0;
}
好啦,关于进阶指针(上)的知识点到这里就结束啦,后期会继续更新C语言的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️
相关文章:
进阶C语言-指针的进阶(上)
指针的进阶 📖1.字符指针📖2.指针数组📖3.数组指针🎈3.1 数组指针的定义🎈3.2 &数组名VS数组名🎈3.3 数组指针的使用 📖4.数组参数、指针参数🎈4.1一维数组传参🎈4.2…...
初始化一个 vite + vue 项目
创建项目 首先使用以下命令创建一个vite项目 npm create vite然后根据提示命令 cd 到刚创建的项目目录下,使用npm install安装所需要的依赖包,再使用npm run dev即可启动项目 配置 vite.config.js 添加process.env配置,如果下面 vue-route…...
关于B+树
在数据库管理系统中,使用b树作为索引的数据结构,相比于B树和二叉树,有以下几个好处: b树的非叶子节点只存储关键字和指针,不存储数据,这样可以增加每个节点的关键字数量,降低树的高度ÿ…...
axios 请求和响应拦截器
1. 创建实例 使用 axios.create() 使用自定义配置创建一个 axios 实例。 const $http axios.create({timeout: 1000,headers: {Content-Type: application/json,} })2. 拦截器 在请求或响应被 then 或者 catch 处理前拦截他们,拦截分为请求拦截和响应拦截。 //…...
Element-ui select远程搜索
template部分: <el-form-item label"用户" prop"userId"><el-selectv-model"temp.userId"placeholder"用户"filterableremote:reserve-keyword"false":remote-method"remoteMethod":loading"loadi…...
【Express.js】Docker部署
Docker部署 本节我们来介绍如何使用 Docker 部署 express 应用 准备工作 linux 系统安装好 Docker一个基础的 evp-express-cli 项目,选上 pkg 工具包Docker 的详细用法本文不做介绍,请先自行查阅了解 在 Docker 中部署源码 一个很简单的部署方法就是…...
面试2:通用能力
15丨如何做好开场:给自我介绍加“特效 第一层,满足面试官对信息的期待 这是对自我介绍的基本要求,把个人信息、主要经历、经验和技能有条理地组织起来, 有逻辑地讲出来。需要找出多段经历的关联性和发展变化,形成连…...
zookeeper/HA集群配置
1.zookeep配置 1.1 安装4台虚拟机 (1)按照如下设置准备四台虚拟机,其中三台作为zookeeper,配置每台机器相应的IP,hostname,下载vim,ntpdate配置定时器定时更新时间,psmiscÿ…...
4.6版本Wordpress漏洞复现
文章目录 一、搭建环境二、漏洞复现1.抓包2.准备payload3.发送payload4.检查是否上传成功5.连接payload 国外的:Wordpress,Drupal,Joomla,这是国外最流行的3大CMS。国内则是DedeCMS和帝国,PHPCMS等。 国内的CMS会追求大…...
腾讯云学生专属便宜云服务器如何购买?
随着云计算技术的快速发展,越来越多的学生开始关注和使用云服务器。腾讯云作为国内知名的云计算服务提供商,推出了一系列针对学生的优惠活动,让更多学生能够享受到云服务器的便利和优势。本文将详细介绍如何购买腾讯云学生专属的便宜云服务器…...
逗号分隔String字符串 - 数组 - 集合,相互转换
1. 准备一个逗号分割字符串 String str "小张,小王,小李,小赵";2. 逗号分割字符串转换为集合(转换为集合之前会先转换为数组) // 第一种:先用split将字符串按逗号分割为数组,再用Arrays.asList将数组转换为集合 List<String> strList…...
基于blockqueue的生产和消费模型
线程篇下讲的是基于阻塞队列的生产者消费者模型。在学习这个之前我们先了解一些其他概念: 同步:在保证数据安全的条件下,让线程按某种特定的顺序依次访问临界资源。 通过上一节的代码我们实现了一个多线程抢票的程序,但结果显示…...
Editors(Vim)
文章目录 Editors(Vim)学哪一个编辑器?Vim Philosophy of VimModal editing 模态编辑Basics 基础知识Inserting text 插入文本Buffers, tabs, and windows 缓冲区、选项卡和窗口Command-line 命令行 Vim’s interface is a programming language. Vim的接口是一种编…...
【Leetcode】134.加油站
一、题目 1、题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost,如果你…...
设计模式-建造者(生成器)模式
文章目录 简介建造者模式的核心概念产品(Product)建造者(Builder)指挥者(Director)建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…...
内存泄露排查思路
1、泄露情况 启动闪退运行一段时间宕机 2、排查步骤 获取堆内存快照dump使用VisualVM分析dump文件通过查看堆信息的情况,定位内存溢出问题 jmap -dump:formatb,fileheap.hprof pid -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath输出路径 3、在VisualVM中分…...
kafka学习-概念与简单实战
目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…...
爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)
目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具:Chrome浏览器chromedriverselenium win用户:chromedriver.exe放在python.exe旁边 MacO…...
音视频编码格式-AAC ADT
例子:config 1408 1408(16进制) : 0001 0100 0000 1000 audioObjectType(5bit)为 00010 , 即 2, profie (audioObjectType -1 ) AAC LC samplingFrequencyIndex (4bit) 为 1000 , 即 8 , 对应的采样频率为 16000 channelConfiguration (…...
【计算机网络】网络编程接口 Socket API 解读(3)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具,和其他平台(比如 os-x …...
OBS Studio架构深度解析:如何构建专业级直播系统的核心技术栈
OBS Studio架构深度解析:如何构建专业级直播系统的核心技术栈 【免费下载链接】obs-studio OBS Studio - 用于直播和屏幕录制的免费开源软件。 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio OBS Studio作为开源直播录制软件的标杆ÿ…...
3大核心技术解析:猫抓cat-catch如何实现浏览器媒体资源精准捕获
3大核心技术解析:猫抓cat-catch如何实现浏览器媒体资源精准捕获 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓cat-catch是一款专为技术爱好者和开发者设计的浏览器扩展工具…...
如何让AI成为你的第二大脑?AnythingLLM浏览器扩展使用指南
如何让AI成为你的第二大脑?AnythingLLM浏览器扩展使用指南 【免费下载链接】anything-llm 这是一个全栈应用程序,可以将任何文档、资源(如网址链接、音频、视频)或内容片段转换为上下文,以便任何大语言模型(…...
Loop:重新定义macOS窗口管理的艺术与科学
Loop:重新定义macOS窗口管理的艺术与科学 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在数字工作空间中,窗口管理不再是简单的排列组合,而是一种提升专注力与创造力的空间艺术。Loop…...
ClawdBot个人AI助手5分钟快速部署:零基础搭建本地智能聊天机器人
ClawdBot个人AI助手5分钟快速部署:零基础搭建本地智能聊天机器人 1. 项目介绍 ClawdBot是一个可以在本地设备上运行的个人AI助手,基于vLLM提供后端模型能力。这个开源项目让用户能够快速搭建自己的智能聊天机器人,无需复杂的配置过程。 1.…...
OpenClaw故障排查指南:GLM-4.7-Flash模型连接常见问题解决
OpenClaw故障排查指南:GLM-4.7-Flash模型连接常见问题解决 1. 为什么需要这份指南 上周我在本地部署GLM-4.7-Flash模型时,连续遭遇了三次连接失败。每次错误提示都像谜语一样——"Connection timeout"、"Invalid response"这些报错…...
从ResNet到mHC:DeepSeek重构残差连接,额外开销仅6.7%,附复现代码
2015年,由微软亚洲研究院的何恺明团队提出ResNet,ResNet引入残差连接的概念,用以解决深层神经网络训练中的梯度消失/爆炸和网络退化问题,使得训练极深的网络成为可能。 ��1��&#x…...
FireRedASR Pro应用案例:会议录音转文字,提升工作效率实测
FireRedASR Pro应用案例:会议录音转文字,提升工作效率实测 1. 会议记录痛点与解决方案 1.1 传统会议记录的效率瓶颈 在职场工作中,会议记录是一项耗时且容易出错的任务。根据调研数据显示: 普通员工平均每周花费4-6小时在会议…...
AtlasOS终极指南:专业解决Windows安装错误2502/2503的完整方案
AtlasOS终极指南:专业解决Windows安装错误2502/2503的完整方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trendi…...
ArcGIS实战:5分钟搞定正高转椭球体高度(附详细步骤)
ArcGIS高程转换实战:从正高到椭球体高度的精准跨越 在测绘与地理信息系统中,高程数据的精确转换是许多专业应用的基础环节。无论是卫星影像处理、无人机航测还是工程测量,不同高程基准之间的转换需求无处不在。本文将带您深入理解正高与椭球…...
