【C语言】指针初阶2.0版本

这篇博文我们来继续学习指针的其他内容

在这里插入图片描述

指针2.0

  • 传值调用与传址调用
    • 传值调用
    • 传址调用
  • 一维数组与指针
    • 理解数组名
    • 使用指针
    • 深入理解一维数组
  • 二级指针
  • 指针数组
  • 二维数组与指针

传值调用与传址调用

在开始之前,我们需要先了解这个概念,后面才能够正常的学习

传值调用

int add(int x, int y)
{return x + y;
}
int main()
{int a = 10;int b = 20;int c = add(a, b);printf("%d", c);return 0;
}

经典的传值调用,只需要传值即可,没有过多的要求,但如果我们的要求是将ab互换大小,再用这样的代码就行不通了

void ecn(int x, int y)
{int tmp = x;x = y;y = tmp;
}
int main()
{int a = 10;int b = 20;ecn(a, b);printf("a = %d\n", a);printf("b = %d\n", b);return 0;
}

在这里插入图片描述
我们发现,这样做交换不了两者的值,是因为形参是实参的一份临时拷贝,形参也是有地址的,改变形参影响不了实参,这时我们只能进行传址调用

传址调用

void ecn(int* x,int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
int main()
{int a = 10;int b = 20;ecn(&a, &b);printf("a = %d\n", a);printf("b = %d\n", b);return 0;
}

在这里插入图片描述
这样就能进行调换了,改变实参的值

一维数组与指针

理解数组名

int arr[5] = {1,2,3,4,5};

当我们想要访问arr数组时,我们有一下几种方法

int i = arr[0];
int* p = &arr[0];
int* p = arr;

第一种不必多说,利用访问下标操作符对数组进行访问。第二、三种是我们上一篇文章说的(可移步上一篇:指针初阶),通过指针对数组进行访问,arr与&arr[0]是一样的,都是数组的首元素地址
那我们可能会有疑问了:那&arr是什么样的呢,跟这两个也一样吗?下面我们用编译器来测试下,顺便证明一下第二三种是一样的
打印它们的地址

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5 };printf("&arr[0] = %p\n", &arr[0]);printf("arr =     %p\n", arr);printf("&arr =    %p\n", &arr);return 0;
}

在这里插入图片描述
我们发现它们的地址都是相同的,那它们都相同吗?我们再来看一下

#include <stdio.h>
int main()
{int arr[5] = { 1,2,3,4,5 };printf("%d\n", sizeof(arr));return 0;
}

在这里插入图片描述
如果它们都相同,那么sizeof(arr)与sizeof(arr【0】)应该相同,那应该在32位下为4,只有整个数组的大小才为20,这与我们之前所看到的相悖,我们最后来看一下区别在哪

#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+1跟另外两个不同,地址加了20,而另外两个加了4;正如我们所想,arr确实代表着一个数组,但&arr取的是首元素的地址,整个数组是一个整体

使用指针

#include <stdio.h>
int main()
{int arr[5] = { 0 };int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int* p = arr;for (i = 0; i < sz; i++){scanf("%d", p + i);}for (i = 0; i < sz; i++){printf("%d ", p[i]);//这里*(p+i)=p[i]}return 0;

数组元素的访问在编译器处理的时候转换成⾸元素的地址+偏移量求出元素的地址,然后解引⽤来访问。

深入理解一维数组

当我们写函数的时候,如果想要改变数组的内容:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。
其实这个也是想当然的,因为数组可以用指针来表示,二者等同,那么取而代之肯定也是非常正确的,因为数组的本质就是指针

二级指针

二级指针的概念也很简单,就是存放一级指针的地址的指针

int main()
{int i = 10;int* pi = &i;int** ppi = &pi;return 0;
}
*ppi = pi;
**ppi = i;

同理,存放二级指针地址的就是三级指针

指针数组

指针数组就是存放指针的数组,里边每个元素都是地址

int* arr1;//里边的指针类型全部为int*
char* arr2;//里边的指针类型全部为char*

二维数组与指针

#include <stdio.h>
int main()
{int arr1[5] = { 1,2,3,4,5 };int arr2[5] = { 2,3,4,5,6 };int arr3[5] = { 3,4,5,6,7 };int* parr[3] = { arr1, arr2, arr3 };//我们一般把p作为指针变量,后面加上arr表示是数组指针变量,有关于数组指针变量的知识我们下期再分享int i = 0;int j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 5; j++){printf("%d ", parr[i][j]);}printf("\n");}return 0;
}

我们看到很熟悉的parr[ i ][ j ]的形式,这其实就是二维数组的真正形态,在运行时二维数组也是要先变成指针的形式再进行运算的,所以说数组的本质是指针

这篇2.0就到这里了,感谢阅读
在这里插入图片描述

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

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

相关文章

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

引言劝退 VSCode&#xff0c;全称为Visual Studio Code&#xff0c;是由微软开发的一款轻量级&#xff0c;跨平台的代码编辑器。大家能来搜用VSCode配置c/c&#xff0c;想必也知道VSCode的强大&#xff0c;可以手握一个VSCode同时编写如C&#xff0c;C&#xff0c;C#&#xff…

微服务day02-Ribbon负载均衡与Nacos安装与入门

一.Ribbon负载均衡 在上一节中&#xff0c;我们通过在RestTemplte实例中加上了注解 LoadBalanced,表示将来由RestTemplate发起的请求会被Ribbon拦截和处理&#xff0c;实现了访问服务时的负载均衡&#xff0c;那么他是如何实现的呢&#xff1f; 1.1 Ribbon负载均衡的原理 Rib…

链表的归并排序-LeetCode(Python版)

双指针归并排序&#xff01;图解排序链表&#xff01;-知乎 class ListNode(object):def __init__(self, val0, nextNone):self.val valself.next nextclass Solution(object):def find_mid(self, head): # 快慢指针slow, fast head, headwhile fast.next and fast.next.n…

linux 硬盘存储剩余容量自动化监控+报警通知

linux 硬盘存储剩余容量自动化监控报警通知 编写shell脚本 #!/bin/bash# 获取系统存储大小&#xff08;单位为GB&#xff09; storage_size$(df -h / | awk NR2 {print $4} | sed s/G//)# 阈值&#xff08;小于10GB触发报警&#xff09; threshold10# 钉钉机器人 Webhook UR…

LabVIEW非接触式电阻抗层析成像系统

LabVIEW非接触式电阻抗层析成像系统 非接触式电阻抗层析成像&#xff08;NEIT&#xff09;技术以其无辐射、非接触、响应速度快的特点&#xff0c;为实时监测提供了新的解决方案。基于LabVIEW的电阻抗层析成像系统&#xff0c;实现了数据的在线采集及实时成像&#xff0c;提高…

代码随想录算法训练营第四十四天|139.单词拆分、56.携带矿石资源

139.单词拆分 思路&#xff1a;将字符串s看作为背包容量&#xff0c;从字符串中获取物品&#xff0c;刚好满足背包容量的过程&#xff0c;因为可以从字符串中多次取值&#xff0c;相当于物品的数量是不限制&#xff0c;这就是一个完全背包的问题&#xff01;这个题有个关键点&a…

Python中的windows路径问题

在Python中处理Windows路径时,经常会遇到一些特殊的问题。这主要是因为Windows和大多数其他操作系统(如Linux和macOS)使用不同的路径分隔符。在Windows中,路径使用反斜杠(\)作为分隔符,而在其他操作系统中,路径使用正斜杠(/)作为分隔符。 以下是在Python中处理Windo…

Java SE:多线程(Thread)

1. 线程两个基本概念 并发&#xff1a;即线程交替运行多个指令并行&#xff1a;即多个线程同时运行指令 并发并行不矛盾&#xff0c;两者可同时发生&#xff0c;即多个线程交替运行指令 2. 多线程3种实现方式 2.1 直接创建线程对象 /*** 方式1&#xff1a;* 1. 创建thread类的…

mybatis plus 深入学习 【Base Mapper】的方法 【IService】的方法

mybatis plus 深入学习 常见注解 1.TableName 描述&#xff1a;表名注解&#xff0c;标识实体类对应的表使用位置&#xff1a;实体类 TableName("sys_user") public class User {private Long id;private String name;private Integer age;private String email;…

【Linux系统化学习】信号的保存

目录 阻塞信号 信号处理常见方式概览 信号的其他相关概念 在内核中的表示 sigset_t 信号集操作函数 sigprocmask函数 sigpending函数 信号的捕捉 内核如何实现信号的捕捉 sigaction函数 可重入函数 volatile 阻塞信号 信号处理常见方式概览 当信号来临时&#x…

c++算法入门教程(2)

C是一种功能强大且广泛应用的编程语言&#xff0c;对于想要深入学习编程和算法的人来说&#xff0c;掌握C是一个重要的里程碑。本文将带你逐步了解C编程的基础知识&#xff0c;并介绍一些常见的算法和编程技巧帮你入门c算法。 ​在c算法入门教程(1) 中&#xff0c;我讲解了什么…

GEE:使用Sigmoid激活函数对单波段图像进行变换(以NDVI为例)

作者:CSDN @ _养乐多_ 本文将介绍在 Google Earth Engine (GEE)平台上,对任意单波段影像进行 Sigmoid 变换的代码。并以对 NDVI 影像像素值的变换为例。 文章目录 一、Sigmoid激活函数1.1 什么是 Sigmoid 激活函数1.2 用到遥感图像上有什么用?二、代码链接三、完整代码一…

查询每个会话使用内存大小(DM8达梦数据库)

DM8达梦数据库查询每个会话使用内存大小 1 环境介绍2 查询每个sql会话使用内存大小3 达梦数据库学习使用列表 1 环境介绍 在某些环境数据库内存增长到服务器内存用完,发生OOM事件,可以分析sql会话使用内存大小; 2 查询每个sql会话使用内存大小 --创建SQL会话占用内存记录表 …

共享栈的C语言实现

共享栈&#xff1a;所谓共享栈就是为了节省空间&#xff0c;让两个栈共享一片连续的存储空间&#xff0c;两个栈从这片连续的共享空间的两端向中间扩充自己的存储空间&#xff0c;设这片存储空间的大小为maxSize&#xff0c;采用栈顶指针始终指向当前栈顶元素的方式来实现共享栈…

简单认识算法的复杂度

时间复杂度与空间复杂度 1.算法的复杂度 ​ 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 ​ 时间复杂度主要衡量一个算法…

MYSQL02高级_目录结构、默认数据库、表文件、系统独立表空间

文章目录 ①. MySQL目录结构②. 查看默认数据库③. MYSQL5.7和8表文件③. 系统、独立表空间 ①. MySQL目录结构 ①. 如何查看关联mysql目录 [rootmysql8 ~]# find / -name mysql /var/lib/mysql /var/lib/mysql/mysql /etc/selinux/targeted/tmp/modules/100/mysql /etc/seli…

前端src中图片img标签资源的几种写法?

在 Vue 项目中引用图片路径有几种不同的方法&#xff0c;具体取决于你的项目结构和配置。以下是几种常见的方式&#xff1a; 1. 静态资源目录 (Public) 如果你的图片放在了项目的 public 目录下&#xff08;例如&#xff0c;Vite 和 Create Vue App 脚手架工具通常使用这个目…

05 OpenCV图像混合技术

文章目录 理论算子示例 理论 其中 的取值范围为0~1之间 算子 addWeighted CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2, double beta,double gamma, OutputArray dst, int dtype -1 ); 参数1&#xff1a;输入图像Mat …

2024年【广东省安全员A证第四批(主要负责人)】考试试卷及广东省安全员A证第四批(主要负责人)作业模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试试卷根据新广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将广东省安全员A证第四批&#x…