当前位置: 首页 > news >正文

C语言笔记(指针的进阶)

目录

1.字符指针

2.指针数组

3.数组指针

3.1.创建数组指针

3.2.&数组名和数组名        


1.字符指针

int main()
{   char ch ='w';char* pc =&ch;const char *p = "abcdef";//常量字符串 产生的值就是首元素的地址//常量字符串不能被修改 因此需要加上一个constprintf("%s", p);//打印字符串,只要有字符串的起始位置就可以了,不用解引用如果解引用打印的就是a.return 0;
}
//*p = 'a';//如果加上这一行,程序不会报错但是会崩溃

        内存中的放置是 

        指针指向是字符串首个元素的地址

        字符串和数组本质上是差不多的,都是在内存中连续存储的。但是整型数组是无法依靠一个%s将数组完全输出,因为数组中没有'\0'和0停止字符。

例题

#include <stdio.h>
int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";char *str3 = "hello bit.";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");//因此他们两个指向的地址是一样的。  else                               //比较是两个数组的地址,两者的地址会指向同一个字符串printf("str3 and str4 are not same\n");return 0;
}

2.指针数组

        指针数组是用来存放指针的数组。

int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5];//二级字符指针的数组

举例1

int main()
{//存放字符指针的数组,指针数组const char* arr[5] = { "abcdef","未经遗憾寒彻骨","怎得梅花扑鼻香","123456" };int i = 0;for (i = 0; i < 4; i++){printf("%s\n", arr[i]);}return 0;
}

举例2

#include <stdio.h>
int main()
{//使用一维数组和指针数组来模拟二维数组//1、创建一维数组int arr1[4] = { 1,2,3,4 };int arr2[4] = { 2,3,4,5 };int arr3[4] = { 3,4,5,6 };int arr4[4] = { 4,5,6,7 };//2、创建指针数组int *arr[4] = { arr1,arr2,arr3,arr4 };//3、采用循环的方式打印数组int i = 0;for (i = 0; i < 4; i++){int j = 0;for (j = 0; j < 4; j++){//printf("%d ",(*arr[i]+j) );上述的写法和下述的写法在规则上含义是相同的printf("%d ", arr[i][j]);}printf("\n");}return 0;
}

3.数组指针

         引入

        字符指针—存放字符地址的指针—指向字符的指针 char*

        整型指针—存放整型地址的指针—指向整型的指针 int*

        浮点型指针—存放浮点型地址的指针—指向浮点型的指针 float*

        数组指针——存放数组地址的指针—指向数组的指针,指向的整个数组,因此数组指针是一个指针。

3.1.创建数组指针
int main()
{int a = 10;int *pa = &a;int arr[10] = { 0 };int * pa1[10] = &arr;//会报错的哦//等号前面前面的是指针数组,其中存储的类型是int * ,和&arr数组指针不同类型int (*pa2)[10] = &arr;//数组指针,在去掉pa之后//int(*)[10] = &arr;表示类型是数组指针 arr是数组的名字 int[10]是数组的类型 return 0;
}

        上述程序会报错的哦。

char arr[5];
char(*pc)[5] = &arr;//数组的指针必须有数据类型和数组元素个数,这就是数组的类型

        数组指针的用法较为鸡肋加深印象

int main()
{//创建数组int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//创建数组指针int(*pa)[10] = &arr;int i = 0;for (i = 0; i < 10; i++){printf("%d ", (*pa)[i]);}return 0;
}

        数组指针解引用之后就可以得到整个数组了

    打印二维数组的话,会比较方便一点,这里要先知道二维数组的名字是第一行一位数组的数组指针。

#include <stdio.h>
void Print(int str[3][4])
{int i = 0;//行数for (i = 0; i < 3; i++){int j = 0;//列数for (j = 0; j < 4; j++){printf("%d ",(*(str+i))[j] );//[]的优先级比*优先级高,因此外部再加一个括号提高优先级//(*(str + i))[j] 和str[i][j]两者是一样的}printf("\n");}
}int main()
{//创建一个完整的二维数组int arr[3][4] = { {1,2,3,4},{2,3,4,5},{3,4,5,6} };//使用函数传址来打印Print(arr);return 0;
}
3.2.&数组名和数组名        

        结论:&数组名是整个数组的地址,数组名就是首元素的地址

int main()
{int arr[10] = { 0 };//数组名字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取出的指针,指向的是整个数组。

int arr[5];			//整型数组,存储5个元素
int *parr1[10];		//指针数组,存储指针数据10个
int(*parr2)[10];    //数组指针,parr2是指针变量,指向的是数组int[10] ,有10元素,
int(*parr3[10])[5]; //数组指针,指针变量是parr3[10],指向的是int[5],
//相当于有一个int [10],每一个元素中装一个int[5]的地址,

int(*parr3[10])[5];图解

4.数组传参和指针传参

5.函数指针

6.函数指针数组

7.指向函数指针数组的指针

8.回调函数

9.指针和数组面试题的解析

相关文章:

C语言笔记(指针的进阶)

目录 1.字符指针 2.指针数组 3.数组指针 3.1.创建数组指针 3.2.&数组名和数组名 1.字符指针 int main() { char ch w;char* pc &ch;const char *p "abcdef";//常量字符串 产生的值就是首元素的地址//常量字符串不能被修改 因此需要加上一个…...

NodeJS连接MySQL 8.4报错:code: ‘ER_TABLEACCESS_DENIED_ERROR‘

NodeJS连接MySQL 8.4报错&#xff1a;code: ER_TABLEACCESS_DENIED_ERROR { code: ER_TABLEACCESS_DENIED_ERROR, errno: 1142, sqlMessage: "SELECT command denied to user 用户名localhost for table 表名", sqlState: 42000, index: 0, sql: SELECT …...

力扣66~70题

题66&#xff08;简单&#xff09;&#xff1a; python代码&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:s_str.join([str(i) for i in digits])nstr(int(s_str)1)n_strlist(n)res[int(i) for i in n_str]return res题67&#xff08;简…...

Axure重要元件三——中继器添加数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 本节课&#xff1a;中继器添加数据 课程内容&#xff1a;添加数据项、自动添加序号、自动添加数据汇总 应用场景&#xff1a;表单数据的添加 案例展示&#xff1a; 步骤…...

矩阵系统哪家好~矩阵短视频运营~怎么矩阵OEM

一、引言 在当今的数字化时代&#xff0c;矩阵系统在众多领域中发挥着至关重要的作用&#xff0c;如视频监控、信号切换、自动化控制等。然而&#xff0c;如何判断一个矩阵系统是否好用成为了许多用户面临的问题。本文将从多个方面探讨矩阵系统好用与否的判断标准&#xff0c;希…...

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…...

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…...

AnaTraf | TCP重传的工作原理与优化方法

目录 什么是TCP重传&#xff1f; TCP重传的常见触发原因 TCP重传对网络性能的影响 1. 高延迟与重传 2. 吞吐量的下降 如何优化和减少TCP重传 1. 优化网络设备配置 2. 优化网络链路 3. 网络带宽的合理规划 4. 部署CDN和缓存策略 结语 AnaTraf 网络性能监控系统NPM | …...

python从0快速上手(一)python环境搭建 windows macos linux

Python环境搭建超详细指南 Python是一种广泛使用的高级编程语言&#xff0c;它以其简洁的语法和强大的功能而受到开发者的喜爱。对于初学者来说&#xff0c;搭建一个合适的Python开发环境是开始Python之旅的第一步。本文将为你提供一个超级详细的Python环境搭建指南&#xff0…...

麒麟aarch64架构下安装compat-openssl10

问题描述&#xff1a; 麒麟aarch64架构下安装mysql8.0.40,报错nothing provides libcrypto.so.10()(64bit) needed by 原因&#xff1a; 你当前系统的 OpenSSL 版本与 MySQL 8.0.40 所需的库不匹配。MySQL 8.0.40 需要 libcrypto.so.10&#xff0c;而你的系统使用的是 OpenS…...

React远程组件

什么是远程组件&#xff1f; 远程组件指的是从远程服务器动态加载的组件&#xff0c;这些组件可以是React、Vue等框架的组件。 为什么需要远程组件 本质上就是为了解决复用问题&#xff0c;那引出新的问题有几种公共项目代码复用方式&#xff1f; Git仓库 将公共代码单独抽…...

ssm教师上课系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…...

【C】分支和循环--猜数字游戏

分支和循环 练习&#xff1a;猜数字游戏 游戏要求&#xff1a; 1&#xff1b;电脑自动生成1~100的随机数 2&#xff1b;玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的大小给出大了或小了的反馈&#xff0c;直到猜出&#xff0c;游戏结束 随机数生成 函数…...

Liunx 操作redis

1,到Liunx的redis的安装目录下/home/redis/redis-7.2.3/src 执行命令 ./redis-cli2,执行命令后&#xff0c;出现以下 127.0.0.1:6379>3,输入密码 127.0.0.1:6379> AUTH 你的密码4,切换db库 127.0.0.1:6379> SELECT 55,操作命令 查看当前 db库的缓存 127.0.0.1:63…...

C#教程笔记

C#开发的程序依附.NET平台 编译器->IL中间语言->CLR->机器指令 .NET CORE平台 跨平台 .cs后缀名 快捷键 CtrlKD格式化CtrlL或CtrlX删除一行CtrlY反撤销cwTab快速生成命令行输出Ctrl空格或CtrlJ获取提示///方法注释CtrlMO代码全部折叠CtrlML代码全部展开 上升沿0变1 安…...

Docker 部署 RocketMQ

1.拉取RocketMQ镜像 这里以dockerhub上 RocketMQ 5.2.0版本的镜像为例&#xff0c;介绍部署过程。 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/rocketmq:5.2.02.创建容器共享网络 RocketMQ 中有多个服务&#xff0c;需要创建多个容器&#xff0c;创建 docke…...

linux安装mysql数据库(最完整的yum源安装)

1.下载YUM库 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm这里介绍一下wegt命令 wget 是一个非常强大的命令行工具&#xff0c;用于从网络上下载文件。它支持HTTP、HTTPS和FTP协议&#xff0c;并且可以通过HTTP代理进行下载。以下是 wget 的…...

工业物联网关-TCP透传

TCP透传功能提供类似于DTU(Data Transmit Unit)的功能&#xff0c;用户在网络端使用TCP协议连接网关&#xff0c;与串口通道绑定&#xff0c;建立起TCP与串口的通道&#xff0c;网关相当于一个中转点。 菜单选择"数据上行-tcp透传"&#xff0c;查看当前透传通道列表&…...

sentinel原理源码分析系列(六)-统计指标

调用链和统计节点构建完成&#xff0c;进入统计指标插槽&#xff0c;统计指标在最后执行的&#xff0c;等后面的插槽执行完&#xff0c;资源调用完成了&#xff0c;根据资源调用情况累计。指标统计是最重要的插槽&#xff0c;所有的功能都依靠指标数据&#xff0c;指标的正确与…...

【代理模式使用场景】

一般来说&#xff0c;代理模式使用场景是远程代理、虚拟代理、安全代理等。下面来详细介绍下这三个场景是什么&#xff0c;实现原理和特点。不过在介绍三个场景前&#xff0c;我们还是先来回顾下代理模式。 代理模式 定义 是结构型设计模式&#xff0c;引入一个对象控制对另…...

ARM-8 代码还原动态调试之 pstree 条件表达式

out_string(lvl level - 1 ? last ? sym->last_2 : sym->branch_2 : more[lvl 1] ? sym->vert_2 : sym->empty_2); 条件表达式执行顺利&#xff1a; lvl level - 1 ? last ? sym->last_2 : sym->branch_2 : more[lvl 1] ?…...

Spring Boot技术栈在电影评论网站中的应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

DDOS防护

DDoS攻击简介 分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种网络攻击方式&#xff0c;通过控制大量的受感染系统&#xff08;称为“僵尸网络”&#xff09;向目标服务器发送大量的网络流量或请求&#xff0c;目的是使目标服务器超载&#xff0c;无法提供正常服务。这…...

【Vue】Vue(九)OptionsAPI与CompositionAPI的区别

文章目录 OptionsAPI与CompositionAPI在代码使用和逻辑上的区别一、代码使用方面的区别&#xff08;一&#xff09;组件定义的结构&#xff08;二&#xff09;响应式数据的定义与使用&#xff08;三&#xff09;逻辑复用的实现方式 二、逻辑方面的区别&#xff08;一&#xff0…...

MySQL 【日期】函数大全(四)

目录 1、MAKEDATE() 根据年份和一年中天数创建一个日期并返回。 2、MAKETIME() 指定的时、分、秒创建一个时间并返回。 3、MINUTE() 函数提取并返回时间的分钟部分。 4、MONTH() 函数提取日期的月份部分并作为数字返回。 5、MONTHNAME() 返回给定日期的月份的名字。 6、N…...

Jlink 直接读取单片机数据

1. 驱动版本 因人而异&#xff0c;这里我使用的是 “J-Flash V6.96” 本人驱动链接&#xff1a;夸克网盘 提取码&#xff1a;rgzk 2. 打开软件 3. 创建jlink工程 4. 选择芯片 此处本人使用芯片 “STM32F103VCT6” 5. 连接单片机 连接成功反馈 6. 读取单片机内部数据 …...

VScode运行C语言终端输出中文乱码问题解决方案

VScode运行C语言输出中文乱码问题解决方案 由于 VSCode 的终端是对系统的 cmd 命令行工具的调用&#xff0c;而 cmd 的默认编码为 GBK。当我们在 VSCode 中以 UTF-8 编码进行代码编写且代码里含有中文字符时&#xff0c;在终端运行代码便会出现中文乱码现象。要解决此问题&…...

Leetcode刷题. 贪心算法

贪心算法&#xff1a; 比较传统的解释&#xff1a;将整个问题拆解为几个小问题&#xff0c;找到小问题的最优解&#xff0c;加起来就是整个问题的全局最优解。对于现在的我理解贪心就是一种感觉&#xff0c;给出证明很难&#xff0c;解题思路一般就是认真读题&#xff0c;发掘题…...

强化学习的数学原理-01基本概念

state: T h e s t a t u s o f a g e n t w i t h r e s p e c t t o t h e e n v i r o n m e n t The \quad status \quad of \quad agent \quad with \quad respect \quad to \quad the \quad environment Thestatusofagentwithrespecttotheenvironment (agent 相对于环境的…...

D41【python 接口自动化学习】- python基础之函数

day41 函数参数传递错误 学习日期&#xff1a;20241018 学习目标&#xff1a;函数&#xfe63;-54 避坑指南&#xff1a;列表作为参数传递出错了怎么办&#xff1f; 学习笔记&#xff1a; 列表类型的特殊性 list1[x,y,z] tuple1(list1,b,c)# 修改元组中的列表&#xff0c;会…...