深入理解指针(c语言)

目录

  • 一、使用指针访问数组
  • 二、数组名的理解
      • 1、数组首元素的地址
      • 2、整个数组
  • 三、一维数组传参的本质
  • 四、冒泡排序
  • 五、二级指针
  • 六、指针数组

一、使用指针访问数组

可以使用指针来访问数组元素。例如,可以声明一个指针变量并将其指向数组的第一个元素,然后通过递增指针的方式来访问数组的其他元素:

#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int* ptr = arr; // 指针指向数组的第一个元素for (int i = 0; i < 5; i++){printf("%d ", *ptr); // 访问数组元素ptr++; // 指针递增,指向下一个元素}return 0;
}
  • 输出结果:
    在这里插入图片描述

二、数组名的理解

在C语言中,数组名有时代表数组中首元素的地址,有时代表整个数组,视情况而定。

1、数组首元素的地址

例1: 定义一个整型数组arr,可以用数组名arr表示数组的首地址,作为参数传递给函数:

#include<stdio.h>void printArray(int arr[], int size) 
{for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() 
{int arr[5] = {1, 2, 3, 4, 5};printArray(arr, 5);return 0;
}
  • 输出结果:
    在这里插入图片描述

这里,printArray函数的参数形式为int arr[],实际上是将数组名arr作为指针常量传递给函数。


例2: 用数组名访问数组中的元素:

#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int* ptr = arr;printf("%d\n", *ptr);    // 输出1ptr++;printf("%d\n", *ptr);    // 输出2return 0;
}
  • 输出结果:
    在这里插入图片描述

这里,arr和ptr都指向数组的第一个元素,可以通过指针操作来访问数组的元素。


2、整个数组

例1: sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩(单位是字节):

#include<stdio.h>
int main()
{int arr[5] = { 1, 2, 3, 4, 5 };int size = sizeof(arr);printf("%d\n", size);return 0;
}
  • 输出结果:
    在这里插入图片描述
    例2: &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
#include<stdio.h>
int main()
{int arr[5] = { 1,2,3,4,5 };printf("&arr[0]   = %p\n", &arr[0]);printf("&arr[0]+1 = %p\n", &arr[0] + 1);printf("arr       = %p\n", arr);printf("arr+1     = %p\n", arr + 1);printf("&arr      = %p\n", &arr);printf("&arr+1    = %p\n", &arr + 1);return 0;
}
  • 输出结果:
    在这里插入图片描述
    这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是⾸元素的地址,+1就是跳过⼀个元素。
    但是&arr和&arr+1相差20个字节,这就是因为&arr是数组的地址,+1操作是跳过整个数组的。

除了这两个例子之外,其他任何地⽅使⽤数组名都表⽰⾸元素的地址。

三、一维数组传参的本质

在C语言中,一维数组传参时,实际上传递的是数组的首地址,也就是数组名。函数可以通过修改传入的数组来修改实际的数据。

#include<stdio.h>void modifyArray(int arr[], int size) 
{for (int i = 0; i < size; i++) {arr[i] *= 2; // 修改数组元素}
}int main() 
{int arr[5] = {1, 2, 3, 4, 5};modifyArray(arr, 5); // 传递数组名作为参数for (int i = 0; i < 5; i++) {printf("%d ", arr[i]); // 输出修改后的数组}return 0;
}
  • 输出结果:
    在这里插入图片描述

四、冒泡排序

冒泡排序是一种基本的排序算法,通过多次比较和交换来实现。算法的核心思想是从数组的第一个元素开始,依次比较相邻的两个元素如果前一个元素大于后一个元素,则交换它们的位置

#include<stdio.h>void bubbleSort(int arr[], int size) 
{for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}int main() 
{int arr[5] = {5, 4, 3, 2, 1};bubbleSort(arr, 5);for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
  • 输出结果:
    在这里插入图片描述

五、二级指针

二级指针是指向指针的指针。通过使用二级指针,可以在函数中修改指针的值,间接修改指针指向的变量。

#include<stdio.h>void changeValue(int **ptr) 
{int newValue = 10;*ptr = &newValue; // 修改二级指针指向的变量
}int main() 
{int value = 5;int *ptr = &value;changeValue(&ptr); // 传递二级指针作为参数printf("%d", *ptr); // 输出修改后的值return 0;
}
  • 输出结果:
    在这里插入图片描述

六、指针数组

指针数组是一个数组,其中的每个元素都是指针。通过指针数组,可以存储多个指针,并进行相应的操作。

#include<stdio.h>int main() 
{int a = 1, b = 2, c = 3;int *ptrArray[3]; // 声明指针数组ptrArray[0] = &a; // 将指针赋值给数组元素ptrArray[1] = &b;ptrArray[2] = &c;for (int i = 0; i < 3; i++) {printf("%d ", *ptrArray[i]); // 输出数组元素指向的值}return 0;
}
  • 输出结果:
    在这里插入图片描述

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

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

相关文章

c语言经典测试题2

1.题1 我们来思考一下它的结果是什么&#xff1f; 我们来分析一下&#xff1a;\\是转义为字符\&#xff0c;\123表示的是一个八进制&#xff0c;算一个字符&#xff0c;\t算一个字符&#xff0c;加上\0&#xff0c;应该有13个&#xff0c;但是strlen只计算\0前的字符个数。所以…

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

Gitlab 设置页面语言为简体中文

1.用户登录&#xff0c;点击头像&#xff0c;再点击Preferences&#xff08;偏好设置&#xff09; 2.向下滑动&#xff0c;找到 Localization&#xff08;本地化&#xff09;&#xff0c;进行修改&#xff0c;并保存 3.刷新页面&#xff0c;就更改成简体中文了

药厂常用实验室耗材PFA药勺耐腐蚀透明长柄取样勺

实验室取用药品或少量样品时&#xff0c;常用到药匙&#xff0c;PFA药匙分固体药匙和液体药匙两种&#xff0c;别名也叫量勺、药勺、搅拌勺、样品勺、取样勺等。 PFA取样勺&#xff0c;常用于高要求实验条件下取用少量粉末微量颗粒等。可根据您的需要定制各种尺寸、规格的四氟…

【深度学习笔记】回归与分类

回归与分类 1 Logistic 回归 定义 目标&#xff1a;给定数据点 X ( n ) ∈ R m X^{(n)}∈R^m X(n)∈Rm 和相应标签 t ( n ) ∈ Ω t^{(n)}∈Ω t(n)∈Ω &#xff0c;找到一个映射 f : R m → Ω f:R^m→Ω f:Rm→Ω 回归的目的是预测一个连续的数值变量&#xff0c;如果Ω…

jenkins的nmp install命令无法下载包

问题&#xff1a;在jenkin的流水线脚本中执行到&#xff1a;npm install命令后无法下载前端依赖包 1、进到jenkins的工作目录&#xff0c;一般在底层为/var/lib/jenkins/workspace/任务名称 cd /var/lib/jenkins/workspace/xkc处理方式&#xff1a; # 查看镜像源 npm config …

Redis篇----第十二篇

系列文章目录 文章目录 系列文章目录前言一、一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set 他们最多能存放多少元素二、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?三、Redis 最适合的场景?前言 前些天发现了一…

游戏配置二级缓存一致性问题解决方案

游戏服务器进程在启动的时候&#xff0c;一般会把所有策划配置数据加载到内存里&#xff0c;将主键以及对应的记录存放在一个HashMap容器里&#xff0c;这称为一级缓存。部分功能可能还需要缓存其他数据&#xff0c;这些称为二级缓存。举个例子&#xff0c;对于如下的玩家升级表…

如何删除PS最近使用项

ps删除最近文件列表 点击菜单栏中文件&#xff0d;>最近打开文件&#xff0d;>清除最近的文件列表

【OpenSSH+Jenkins搭建项目自动化部署】

OpenSSHJenkins搭建项目自动化部署 一、Windows安装OpenSSH1.下载2.解压3.安装4.启停服务5.SSH免密登录 二、Jenkins安装1.下载2.安装启动3.登录 三、项目自动化部署1.SSH配置2.项目配置3.权限控制 一、Windows安装OpenSSH 1.下载 https://github.com/PowerShell/Win32-0penS…

如何修改docker容器的端口映射

要修改 Docker 容器的端口映射&#xff0c;你需要停止并删除现有的容器&#xff0c;然后使用新的端口映射重新运行容器。以下是详细步骤&#xff1a; 停止容器&#xff1a; 使用 docker stop 命令停止正在运行的容器。替换 <container_id> 为你要停止的容器的 ID 或者容器…

SVN忽略已提交的文件(ignore,移出版本控制)

本文适用于已安装TortoiseSVN客户端的同学。 1、右键点击要忽略的文件夹或文件&#xff0c;鼠标移到“TortoiseSVN”&#xff0c;找到“Unversion and add to ignore list”&#xff0c;选择文件夹&#xff0c;弹出提示框确认忽略。 2、设置完忽略文件后&#xff0c;还需要做…

微信小程序uniapp校园在线报修系统维修系统java+python+nodejs+php

管理员的主要功能有&#xff1a; 1.管理员输入账户登陆后台 2.个人中心&#xff1a;管理员修改密码和账户信息 3.用户管理&#xff1a;对注册的用户信息进行删除&#xff0c;查询&#xff0c;添加&#xff0c;修改 4.维修工管理&#xff1a;对维修工信息进行添加&#xff0c;修…

合金电阻器与新兴技术的融合:引领电子行业的下一波浪潮?

随着电子行业以前所未有的速度向创新迈进&#xff0c;合金电阻器与尖端技术的集成证明了电子元件的动态特性。本文探讨了合金电阻器与新兴技术的融合&#xff0c;开创了功能化、小型化和效率化的新时代。 1. 与IoT&#xff08;物联网&#xff09;集成&#xff1a; 合金电阻器在…

Spring IoC容器详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本概念 Spring IoC容器是Spring框架的核心组件&#xff0c;它实现了控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;的设计原则。IoC是一种编程思…

IDEA2023.3.4开启SpringBoot项目的热部署【简单明了4步操作】

添加devtools依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency>IDEA开启自动编译 …

Vue路由缓存问题

路由缓存问题的产生 VueRouter允许用户在页面中创建多个视图&#xff08;多级路由&#xff09;&#xff0c;并根据路由参数来动态的切换视图。使用带参数的路由时&#xff0c;相同的组件实例将被重复使用。因为两个路由都渲染同一个组件&#xff0c;比起销毁再创建&#xff0c;…

QFileDialog文件选择对话框

QFileDialog 类是 Qt 框架中用于处理文件对话框的一个类&#xff0c;它继承自 QDialog。QFileDialog 提供了标准的文件选择对话框&#xff0c;使用户能够选择文件或目录。这个类可以用于打开或保存文件&#xff0c;也可以用来选择目录。 主要功能 打开和保存文件&#xff1a;…

单体微服务K8S笔记

单体微服务K8S笔记 https://blog.csdn.net/m0_48341969/article/details/126063832思路参考以上博客 //测试 https://gitee.com/yangbuyi/yi项目组织参考以上git 单体&#xff1a; 不特地介绍 微服务&#xff1a; rpc:远程过程调用 拆分&#xff0c;分别部署&#xff0…

qtday2作业

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;…