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

【C语言】指针那些事(上)

C语言系列

文章目录


文章目录

一. 字符指针

一.(1 ) 数组创建空间的地址和指针指向的地址

二. 指针数组

二.(1)指针数组模拟一个二维数组

​         三. 数组指针

         三.(1)数组指针到底有什么用

对一维数组没有什么用

二.(2)正常的二维数组传参的写法 

总结


前言

该文章详细的讲解都有啥指针,及包括指针的日常使用等等,各位可以愉快的食用该文章的对于指针的理解,可以为大家对指针的理解加深一点。


一. 字符指针

关于指针的基本常识:
1. 指针变量就是个变量,用来存放地址,地址唯一标识一块内存空间。
理解:内存单元是有编号,编号 == 地址 == 指针 要存起来的话就需要一个指针变量 
2. 指针的大小是固定的4 / 8个字节(32位平台 / 64位平台)。
理解:地址/指针的大小是4/8个字节,或者是指针变量的大小是4/8个字节
3. 指针是有类型,指针的类型决定了指针的 + -整数的步长,指针解引用操作的时候的权限。
4. 指针的运算。

int main()
{char ch = 'w';char* pc = &ch;//将一个字符w的地址赋值给到char*类型的指针变量里面去char* p = "abcdef";//该字符串作为一个表达式的时候它的值其实是首字符的地址//当我们把这个字符串赋给p的时候,其实就是将该字符串的首地址赋给p//当我们在x86环境下,一个指针变量是4个字节//常量字符串无法被改变printf("%s\n", p);//通过这个字符指针,可以连续访问整个字符串printf("%c\n",*p);//对p进行解引用只能拿到一个字符return 0;
}

一.(1 ) 数组创建空间的地址和指针指向的地址

我们直接在代码中添加注释,以及游行图,让大家可以更加直观的理解代码中的指针的应用:

int main()
{char str1[] = "hello bit.";char str2[] = "hello bit.";//str1和str2两个数组创建了两个不同空间//系统创建一个常量字符串,因为常量字符串无法被修改,//所以系统不会创建两个相同的常量字符串,//str3和str4这两个指针变量指向的就是那个相同的常量字符串的首地址//str3和str4还是两个不同的指针变量,但是它们的存放的值是相同的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;
}


 二. 指针数组

关于指针数组是个啥?

指针数组是数组
字符数组 - 存放字符的数组
整型数组 - 存放整型的数组
指针数组 - 存放指针的数组,存放在数组中的元素都是指针类型的

  int*         arr[5];//存放整型指针的数组
//整型指针类型 aar数组
char* ch[6];//存放字符指针的数组

int main()
{int a = 1;int b = 2;int c = 3;int d = 4;//不会有人这样使用,因为怎样使用的话,就是多此一举,还不如直接将数字写进数字里面去int* arr[] = { &a,&b,&c,&d };return 0;
}

二.(1)指针数组模拟一个二维数组

我们直接在代码中添加注释,以及游行图,让大家可以更加直观的理解代码中的指针的应用:

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };//int* int* int*  //因为是arr1的地址指向的是数组中的整型,所以是整形指针//这个时候就可以认为arr数组是一个指针数组int* arr[] = { arr1,arr2,arr3 };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;
}

int main()
{//指针数组:就是数组类型是指针类型的数组 char* arr[5] = { "hello bit","hehe","penggeC","bitejiuyeke","c++" };int i = 0;for (i = 0; i < 5; i++){printf("%s\n", arr[i]);}return 0;
}

 三. 数组指针

啥是数组指针: 

指针数组 - 是数组,是存放指针的数组
数组指针 - 是指针
字符指针 - 指向字符的指针
整型指针 - 指向整型的指针
浮点型指针 - 指向浮点数指针
数组指针 - 指向数组的指针

将数组的地址赋给数组指针

 数组名的理解
 数组名是数组首元素的地址
 但是存在两个例外
 1,sizeof(数组名)
 2,&数组名,这里的数组名表示整个数组,取出的是数组的地址

int main()
{int arr[10];printf("%p\n", arr);//数组名是首元素的地址int*printf("%p\n", arr+1);//数组名是首元素的地址+1就是加一个整数4printf("%p\n", &arr[0]);//arr[0]是首元素地址int*printf("%p\n", &arr[0]+1);//arr[0]是首元素地址+1就是加一个整数4printf("%p\n", &arr);//arr的数组地址printf("%p\n", &arr+1);//加1就是增加了一个数组的大小//指针类型决定了指针+1.到底是+几个字节return 0;
}

三.(1)数组指针到底有什么用

对一维数组没有什么用

int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;for (i = 0; i < 10; i++){printf("%d", p[i]);}//int (*p)[10] = &arr//int i = 0;/*for (i = 0; i < 10;){printf("%d", (*p)[i]);}*///这两种形式上不同,但是他们的结果是相同的return 0;
}

二.(2)正常的二维数组传参的写法 

//数组名就是首元素地址 
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");}
}
print(int (*p)[5], int r, int c)
//使用数组指针的形式,传的二维数组,但是指向的第一行的一维数组的地址,一行有5个,
//必须要写成一个一维数组的指针才可以
{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},{2,3,4,5,6},{3,4,5,6,7} };print(arr, 3, 5);return 0;
}
void print(int arr[], int sz)//形式参数是数组形式,因为数组传参传的就是一个地址,而不是创建一个新的数组
{//写成数组形式的形参是因为方便新手理解int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);}
}
void print(int* arr, int sz)//形式参数是指针的形式
{int i = 0;for (i = 0; i < sz; i++){printf("%d", arr[i]);//arr[i] ===> *(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;
}
int arr[5];//arr是一个能够存放5个整型数组数据的数组
int* parr1[10];//parr是一个指针数组,数组大小为10个元素,类型为整型指针类型
int(*parr2)[10];//parr2是一个数组指针,该指针是指向数组的,指向的数组有10个元素,每个元素的类型的是整型
int(*parr3[10])[5];//parr3是一个数组,是存放数组指针的数组,这个数组有10个元素,存放的这个数组指针,指向的数组有5个元素,每个元素都是整型

总结

本文详细的的介绍了一部分的指针的知识,还有代码的理解帮助,并不是全部的知识,大家感觉有用处就好

相关文章:

【C语言】指针那些事(上)

C语言系列 文章目录 文章目录 一. 字符指针 一.&#xff08;1 &#xff09; 数组创建空间的地址和指针指向的地址 二. 指针数组 二.&#xff08;1&#xff09;指针数组模拟一个二维数组 ​ 三. 数组指针 三.(1)数组指针到底有什么用 对一维数组没有什么用 二.(…...

liunx Centos-7.5上 rabbitmq安装

在安装rabbitmq中需要注意&#xff1a; 1、rabbitmq依赖于erlang&#xff0c;需要先安装erlang 2、erlang和rabbitmq版本有对应关系 可参考网页&#xff1a;https://www.rabbitmq.com/which-erlang.html 第一步&#xff0c;安装编译工具及库文件,如果服务器上已经有了&…...

蓝桥杯学长经验笔记

平台&#xff1a;立扣&#xff0c;牛客网&#xff0c;蓝桥云课 &#xff0c;codeforce刷题时间&#xff1a;刷题时间&#xff1a; 每天&#xff1a;有课一个多小时 周末 3-4 小时&#xff1a;学一部分做一点题书&#xff1a;《算法竞赛从入门到进阶》、《算法笔记》、《算法竞赛…...

开发库介绍

一、开发库选择 1.1 概述 STM32开发相关的库有很多&#xff0c;它们都是为了方便开发者使用STM32微控制器而提供的软件工具。根据不同的功能和层次&#xff0c;可以将它们分为以下几类&#xff1a; CMSIS库&#xff08;Cortex Microcontroller Software Interface Standard&am…...

基于单片机的智能清洁小车设计—控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的主要内容和目标二、总体方案设计2.1智能清洁小车的硬件系统组成2.2智能清洁小车的硬件结构图 三、 小车结构设计5.1基本布局和功能分析5.2小车二维及三维图小车三维图&#xff1a; 四、 原理图程序 五、…...

玩转视图变量,轻松实现动态可视化数据分析

前言 在当今数据驱动的世界中&#xff0c;数据分析已经成为了企业和组织中不可或缺的一部分。传统的静态数据分析方法往往无法满足快速变化的业务需求和实时决策的要求。为了更好地应对这些挑战&#xff0c;观测云的动态可视化数据分析应运而生。 在动态可视化数据分析中&…...

【51单片机】:智能施工电梯系统

项目效果&#xff1a; 基于51单片机的智能施工电梯系统 摘 要 智能施工电梯系统目前广泛应用于人们建筑工程中&#xff0c;为人们施工时上下搬运提供了极大的便利。智能施工电梯系统包括密码开启、超重提示&#xff0c;电梯运作及相关信息显示等等功能&#xff0c;施工电梯为我…...

前端线上部署,如何通知用户有新版本

前言 version-polling 是一个轻量级的 JavaScript 库&#xff0c;它可以实时检测 web 应用的 index.html 文件内容是否有变化。当服务端发布新版本后&#xff0c;前端会自动弹出更新提示&#xff0c;让用户刷新页面&#xff0c;以加载最新的资源和功能。这样可以提高用户体验和…...

Debezium日常分享系列之:Debezium2.4版本之用于 MongoDB的Debezium 连接器

Debezium日常分享系列之&#xff1a;Debezium2.4版本之用于 MongoDB的Debezium 连接器 一、综述二、改变流三、阅读偏好四、MongoDB 连接器的工作原理五、支持的 MongoDB 拓扑六、所需的用户权限七、逻辑连接器名称八、执行快照九、临时快照十、增量快照1.增量快照流程2.Debezi…...

编程应用场景:便利店商超进销存管理系统软件,试用版可以免费试用下载

编程应用场景&#xff1a;便利店商超进销存管理系统软件&#xff0c;试用版可以免费试用下载 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。软件在关闭的时候&#xff0c;可以设置会员…...

【LInux】进程概念II -- 描述进程

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我吧&#xff01;你定不会失望。 本篇导航 0. 进程概念1. 描述进程2. 组织进程 0. 进程概念 在初学阶段,我们对进程这个词仅在书上看见过,大多不太理解这个究竟是什么意思…...

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理 参考链接: 一文梳理国产芯片巨头:紫光集团https://zhuanlan.zhihu.com/p/578232102 紫光展锐发展史,曾经的热血海归们如今都去哪了? 然而早在2013年和2014年,展讯和锐迪科就分别被紫光收购。相隔一…...

7.多线程之单例模式

单例模式 文章目录 单例模式1. 什么是单例模式2. 饿汉模式3. 懒汉模式3.1 单线程版&#xff1a;3.2 多线程版 1. 什么是单例模式 单例模式是一种设计模式&#xff0c;常见的设计模式还有工厂模式、建造者模式等。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码…...

docker 常用指令

以下是一些常用的Docker指令&#xff1a; 构建镜像&#xff1a; docker build -t <image_name> <Dockerfile_directory>运行容器&#xff1a; docker run -d --name <container_name> <image_name>查看正在运行的容器&#xff1a; docker ps停止容…...

Numpy、Pandas、Matplotlib学习(更新ing...)

数据科学 一、Numpy二、Pandas三、Matplotlib参考链接 一、Numpy 在numpy中以np.nan表示缺失值&#xff0c;它是一个浮点数。 二、Pandas 1、如要选出col0在30到80之间的行中col3与col1之差为奇数的行&#xff0c;或者col2大于50中的行col3超过col1均值的行&#xff0c;可以…...

Linux-sdio接口

支持模式 4位模式&#xff1a; CMD&#xff1a;命令线&#xff0c;单向传输&#xff0c;由主机控制。 DAT0-DAT3&#xff1a;数据线&#xff0c;双向传输&#xff0c;由主机和外设共同控制。8位模式&#xff1a; CMD&#xff1a;命令线&#xff0c;单向传输&#xff0c;由主机…...

【MATLAB源码-第62期】基于蜣螂优化算法(DBO)的无人机三维地图路径规划,输出最短路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蜣螂优化算法&#xff08;Dung Beetle Optimization, DBO&#xff09;是一种模拟蜣螂在寻找食物和进行导航的过程的优化算法。蜣螂是一种能够将粪球滚到合适地点的昆虫&#xff0c;它们利用天空中的光线和自身的感知能力来确…...

RealVNC Enterprise 7.7.0 Crack

RealVNC连接_旗舰产品 RealVNC Connect 是为需要强大安全性、弹性和安心的组织提供的远程访问解决方案。 设备访问 按需协助 随时随地安全访问和管理任何设备 通过安全的远程访问让您的组织保持联系&#xff0c;帮助您提高生产力并促进更广泛的协作。 随时随地安全远程访问和…...

Windows下Jenkins自动化部署SpringBoot应用

Windows下Jenkins自动化部署SpringBoot应用 1、下载安装包 下载地址&#xff1a; 一个是 msi 程序&#xff1a; https://mirrors.aliyun.com/jenkins/windows/ 一个是 war 程序&#xff1a; https://get.jenkins.io/war-stable/ https://mirrors.jenkins.io/war/ 这里我…...

Leetcode59螺旋矩阵2

代码&#xff1a; class Solution {public int[][] generateMatrix(int n) {if(n1){int[][] arr {{1}};return arr; }int[][] arr new int[n][n];int cnt1;int left 0,right n-1,top0,downn-1;while(left<right){for(int ileft;i<right;i){arr[top][i] cnt;}for(in…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...