深入理解指针(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;
}
- 输出结果:

相关文章:
深入理解指针(c语言)
目录 一、使用指针访问数组二、数组名的理解1、数组首元素的地址2、整个数组 三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组 一、使用指针访问数组 可以使用指针来访问数组元素。例如,可以声明一个指针变量并将其指向数组的第一个元素,然…...
高级语言期末2015级唐班B卷
1.编写函数,按照如下公式计算圆周率π的值(精确到1e-5) #include <stdio.h>double pai() {double last0;double flag1;int n1;while(flag-last>1e-5) {lastflag;flag*1.0*(2*n)*(2*n)/((2*n-1)*(2*n1));n;}return 2*last; }int main…...
开发一款招聘小程序需要具备哪些功能?
随着时代的发展,找工作的方式也在不断变得简单,去劳务市场、人才市场的方式早就已经过时了,现在大多数年轻人都是直接通过手机来找工作。图片 找工作类的平台不但能扩大企业的招聘渠道,还能节省招聘的成本,方便求职者进…...
嵌入式学习-qt-Day3
嵌入式学习-qt-Day3 一、思维导图 二、作业 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳…...
零基础到高级:Android音视频开发技能路径规划
音视频开发趋势 Android音视频开发领域目前正处于一个高速发展的阶段,主要趋势如下: 超高清视频:4K视频亚毫米级显示清晰,更加逼真,为开发更加逼真的虚拟现实应用提供了基础。AI技术:自适应码率控制、视频…...
阿里云香港轻量应用服务器网络线路cn2?
阿里云香港轻量应用服务器是什么线路?不是cn2。 阿里云香港轻量服务器是cn2吗?香港轻量服务器不是cn2。阿腾云atengyun.com正好有一台阿里云轻量应用服务器,通过mtr traceroute测试了一下,最后一跳是202.97开头的ip,1…...
python中websockets与主线程传递参数
目录 一、子线程创建websockets服务端接收客户端数据 二、主线程内启动子线程接收并处理数据 一、子线程创建websockets服务端接收客户端数据并存入队列 发送的消息客户端与服务端统一,多种消息加入判断的标签 服务端:web_server.py import asynci…...
js谐音梗创意小游戏《望子成龙》
🌻 前言 龙年到来,祥瑞满天。愿您如龙般矫健,事业腾飞;如龙鳞闪耀,生活美满。祝您龙年大吉,万事如意! 龙年伊始,我给各位设计了一款原创的小游戏,话不多说,直…...
第十篇:node处理404和服务器错误
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录</...
左右互博。
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 讨厌鬼在和小甜妹在玩石头游戏。 游戏一开始有 nnn 堆石子,第 iii 堆石子,有 aia_iai 个石子。两人轮流进行游戏。 轮到某个人时,这个人先选数量为 x(x&…...
android通过广播打印ram使用信息
在内存非常吃紧的情况下,android设备会开始kill部分非系统进程甚至系统进程来保证基本的系统运行。在这种情况下如何获取设备过去某段时间的ram使用情况至关重要。 通过开发者模式中的“内存”可以完美得知设备内存使用信息。 我们可以通过此途径,设计一…...
内存管理——线性内存,进程空间
低2G为进程空间 开始地址结束地址大小属性00xFFFFF1M保留0x1000000x102FFF栈不固定位置、大小0x1030000x143FFF堆不固定位置、大小0x400000主程序文件不固定位置、大小加载dll不固定位置、大小0x7ffdd000TIB位置,大小编译时固定0x7FFFE000系统与用户共享数据块位置…...
入门Python必读的流程控制语句
流程控制 if-else 语法: if 条件:语句else:语句 例子: a1 #使用方式一 if a>1:print(大于1) else:print(小于等于1) #使用方式二 print(大于1) if a>1 else print(小于等于1) 输出: >>小于等于1 >>小于等于1 if-elif-else 语法: if 条件:语句elif 条件:…...
day05-进程通信
1> 将互斥机制的代码实现重新敲一遍 代码: #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源(上锁&#…...
如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验
【基于AI的Vision Pro空间视频】工作流:这个工作流程用于将2D视频转换为适用于 Vision Pro的Spatial视频: 1、使用Deep3D将2D视频转换为3D SBS: 使用Deep3D工具将2D视频转换为3D SBS格式: 转换例子:Prediction– lucataco/deep3d – Replicatehttps://replicate.com/…...
爬虫基础(下)
requests模块可以用来获取网络数据; 那么对于爬虫来说,要获取下图网页中的内容,就需要网页的URL。 复制链接方法是,打开网页,点击链接框,右键选择复制。 requests.get()函数可用于模拟浏览器请求网页的过…...
【八股文面试】Java基础常见面试题总结(上)
Java基础常见面试题总结(上) Java有哪些特性 简单易学;面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关性);支持多线程( C 语言没有内置的多…...
c++:蓝桥杯的基础算法2(构造,模拟)+练习巩固
目录 构造 构造的基础概念: 模拟 练习1:扫雷 练习2:灌溉 练习3:回文日期 构造 构造的基础概念: 构造算法是一种用于解决特定问题的算法设计方法。在C语言中,构造算法通常涉及到创建一个函数或类来实…...
C++ 和 C#的区别
如是我闻: C#(发音为 “C sharp”)和C是两种流行的编程语言,它们各有特点和用途。下面是这两种语言的一些主要区别: 设计理念和用途: C: 是一种多范式编程语言,支持过程化编程、面向对象编程、泛型编程等。…...
2.14日学习打卡----初学Zookeeper(一)
2.14日学习打卡 目录: 2.14日学习打卡Zookeeper概念一. 集中式到分布式单机架构集群架构什么是分布式三者区别 二. CAP定理分区容错性一致性可用性一致性和可用性的矛盾一致性和可用性如何选择 三. 什么是Zookeeper分布式架构Zookeeper从何而来Zookeeper介绍 四. 应用场景数据发…...
如何将Serge与LangChain集成:打造企业级AI应用的终极指南
如何将Serge与LangChain集成:打造企业级AI应用的终极指南 【免费下载链接】serge A web interface for chatting with Alpaca through llama.cpp. Fully dockerized, with an easy to use API. 项目地址: https://gitcode.com/gh_mirrors/se/serge Serge是一…...
终极指南:如何在4K显示器上完美运行VPet虚拟桌宠模拟器
终极指南:如何在4K显示器上完美运行VPet虚拟桌宠模拟器 【免费下载链接】VPet 虚拟桌宠模拟器 一个开源的桌宠软件, 可以内置到任何WPF应用程序 项目地址: https://gitcode.com/GitHub_Trending/vp/VPet 你是否在4K显示器上运行虚拟桌宠时遇到过模糊、卡顿或…...
IIS网站部署实战:从基础配置到安全优化
1. IIS网站部署基础配置 第一次在Windows Server上部署IIS网站时,我踩了不少坑。记得当时为了调试一个简单的ASP网站,折腾了整整一个下午。现在回想起来,其实只要掌握几个关键步骤,就能轻松完成基础部署。 首先需要在服务器管理器…...
分块技术全解析:长上下文没有杀死它,反而让它成了 RAG 的核心命门
随着 GPT-4o、Claude 3.7 等大模型将上下文窗口推至百万 Token 级别,行业里出现了一种极具误导性的声音:“长上下文已经让文本分块(Chunking)技术彻底过时了”。但现实恰恰相反,长上下文不仅没有淘汰分块,反…...
还在为跨平台模组烦恼?这款工具让你一键获取Steam创意内容
还在为跨平台模组烦恼?这款工具让你一键获取Steam创意内容 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否也曾遇到这样的困境:在Epic Games Stor…...
Empire渗透测试框架深度解析:如何构建无文件攻击链的实战指南
Empire渗透测试框架深度解析:如何构建无文件攻击链的实战指南 【免费下载链接】Empire EmpireProject/Empire: Empire 是一个开源的Post-Exploitation框架,主要用于渗透测试后的操作阶段,通过模块化的设计实现远程命令执行、持久化连接、凭证…...
RWKV7-1.5B-g1a实操手册:curl命令调用generate接口+参数组合避坑指南
RWKV7-1.5B-g1a实操手册:curl命令调用generate接口参数组合避坑指南 1. 模型简介 rwkv7-1.5B-g1a 是基于RWKV-7架构的多语言文本生成模型,特别适合以下场景: 基础问答文案续写简短总结轻量中文对话 这个1.5B参数的版本在单卡24GB显存的GPU…...
Flutter开发踩坑记:CocoaPods安装失败全流程解决方案(含Ruby版本升级)
Flutter开发实战:CocoaPods安装失败的系统级解决方案 当你满怀期待地运行flutter doctor准备大展身手时,屏幕上突然跳出"CocoaPods not installed"的红色警告,这种挫败感每个Flutter开发者都深有体会。不同于简单的"安装-运行…...
图像标注难题如何破解?LabelImg工具全面解析与实战指南
图像标注难题如何破解?LabelImg工具全面解析与实战指南 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out L…...
Flink学习笔记:窗口
简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...
