C语言——深入理解指针(2)

目录

1. 数组名

2. 指针访问数组

3. 一维数组的传参(本质)

4. 冒泡排序

5. 二级指针

6. 指针数组(指针的数组)

7. 指针数组模拟二维数组


1. 数组名

在之前的代码中我们使用指针访问过数组的内容。

int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int *p = &arr[0];//通过&爱如如[0]来拿到数组的第一个元素的地址

数组名其实本来就是地址,而且是数组首元素的地址。

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

但是如果是下面的代码,就不能这么理解。

总结: 数组名一般情况下就是首元素(第一个元素)的地址,但是有两个例外:

1.  sizeof(数组名),sizeof中单独放数组名,这里的数组名表示的是整个数组,计算的是整个数组的大小,单位为字节;

2. &数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)

知道这些后我们来看一下下面的代码,来充分理解一下。

 &arr[0] 和 arr 都是 ⾸元素的地址,+1就是跳过⼀个元素

&arr是数组的地址,+1 操作是跳过整个数组的。

2. 指针访问数组

因为数组名在内存中是连续存放的,数组名就是首元素的地址(方便找到起始位置),这样可以使用指针来访问数组

#include <stdio.h>
int main()
{
    int arr[10] = { 0 };
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    //输⼊
    int* p = arr;//指针p指向arr数组的首元素的地址
    for (i = 0; i < sz; i++)
    {
        scanf("%d", p + i);
        //scanf("%d", &arr[i]);//也可以这样写
        //scnaf("%d", *(arr+i));
    }
    //输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ", *(p + i));
        //printf("%d", arr[i]);
        //printf("%d", *(arr+i));
    }
    return 0;
}
//arr[i]==*(arr+i)  p[i]==*(p+i)

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

3. 一维数组的传参(本质)

我们之前都是在函数外部计算数组的元素个数,那我们可以把函数传给⼀个函 数后,函数内部求数组的元素个数吗?

在数组传参的时候,传递的是数组名,也就是说本质上数组传参本质上传递的是数组首元素的地址。

总结:⼀维数组传参,形参的部分可以写成数组的形式,也可以写成指针的形式。

4. 冒泡排序

冒泡排序的核心思想就是:两两相邻的元素进行比较

#include <stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{
    int i = 0;
    for (i = 0; i < sz - 1; i++)
    {
        int j = 0;
        for (j = 0; j < sz - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}
int main()
{
    int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    for (int i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

5. 二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在二级指针中。

 对二级指针的运算:

*ppa 通过对ppa中的地址进⾏解引⽤,这样找到的是 pa , *ppa 其实访问的就是 pa

**ppa 先通过 *ppa 找到 pa ,然后对 pa 进⾏解引⽤操作: *pa ,那找到的是 a

6. 指针数组(指针的数组)

这是整数数组和字符数组:

 我们可以知道指针数组就是每个元素都是用来存放指针(地址)的。

7. 指针数组模拟二维数组

#include <stdio.h>
int main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[] = { 2,3,4,5,6 };
    int arr3[] = { 3,4,5,6,7 };
    //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
    int* parr[3] = { arr1, arr2, arr3 };
    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]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数组中的元素,但是要注意模拟始终只是模拟,实际上并完全是二维数组,因为每一行都不是连续的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xxljob学习笔记01(小滴课堂)

分布式调度xxl-job源码部署和数据库建立&#xff1a; 在idea中打开安装包&#xff1a; 创建数据库&#xff1a; 建表&#xff1a; 在项目里&#xff1a; 在navicat里运行语句即可&#xff1a; 修改数据库地址和用户名&#xff0c;密码&#xff1a; 配置令牌&#xff0c;不然谁…

Linux环境下自动化创建大量的账号

参考《鸟哥的Linux私房菜基础篇第四版》13.7.2节微调而成&#xff1a; 下面脚本的目的是为服务器的管理员自动化创建大量的账号&#xff0c;节省生命。 #!/bin/bash # This shell script will create amount of Linux login accounts for you. # 1. check the "accounta…

探索计算机视觉:深度学习与图像识别的融合

探索计算机视觉&#xff1a;深度学习与图像识别的融合 摘 要&#xff1a; 本文将探讨计算机视觉领域中的深度学习技术&#xff0c;并重点关注图像识别方面的应用。我们将介绍卷积神经网络&#xff08;CNN&#xff09;的原理、常用的图像数据集以及图像识别的实际应用场景&…

python环境搭建-yolo代码跑通-呕心沥血制作(告别报错no module named torch)

安装软件 安装过的可以查看有没有添加环境变量 好的! 我们发车! 如果你想方便快捷的跑通大型项目,那么必须安装以下两个软件: 1.pycharm2.anaconda对应作用: pycharm:专门用来跑通python项目的软件,相当于一个编辑器,可以debug调试,可以接受远程链接调试!anaconda:专…

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习&#xff0c;给大家分享一下关于进程的一些基础知识。了解这部分内容&#xff0c;只是为后续多线程编程打好基础&#xff0c;因此进程部分的知识&#xff0c;不需要了解更加细节的内容。 清风的CSDN博客 &#x1f61b;&#x1f61b;&a…

Android之高级UI

系统ViewGroup原理解析 常见的布局容器: FrameLayout, LinearLayout,RelativeLayoout,GridLayout 后起之秀&#xff1a;ConstraintLayout,CoordinateLayout Linearlayout Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mOrientation …

OpenGL 自学总结

前言&#xff1a; 本人是工作后才接触到的OpenGL&#xff0c;大学找工作的时候其实比较着急&#xff0c;就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思&#xff0c;很担心自己往后能力跟不上年龄的增长。因此想在工作之余…

【C++】类型转换 ② ( C++ 静态类型转换 static_cast | C 语言隐式转换弊端 | 代码示例 )

文章目录 一、静态类型转换 static_cast1、C 静态类型转换 static_cast2、C 语言隐式转换弊端3、代码示例 在之前写过一篇 C 类型转换的博客 【C 语言】类型转换 ( 转换操作符 | const_cast | static_cast | dynamic_cast | reinterpret_cast | 字符串转换 ) , 简单介绍了 C 类…

Linux系统的文件权限

Linux系统权限的相关概念与理解 (xshell下进行演示) 文章目录&#xff1a; 1:linux系统下两种用户 超级用户(root)与普通用户(非root)的理解root与非root用户之间切换的指令非root用户之间进行切换的指令操作 2:linux文件权限管理 文件访问者的介绍文件的类型与文件的访问权…

openpnp - 自动换刀设置 - 使用克隆功能降低风险

文章目录 openpnp - 自动换刀设置 - 使用克隆功能降低风险概述笔记需要注意的地方将一个做好的吸嘴作为这排其他吸嘴的模板END openpnp - 自动换刀设置 - 使用克隆功能降低风险 概述 自动换刀设置时, 很危险, 动不动就撞刀. 如履薄冰啊:( 看到openpnp在自动换刀时, 有个克隆功…

【Vue】记事本

上一篇&#xff1a;Vue的指令 https://blog.csdn.net/m0_67930426/article/details/134599378?spm1001.2014.3001.5501 本篇所需指令&#xff1a; v- for v-model v-on v-show 目录 删除功能 添加功能 统计功能 清空功能 v-show 删除功能 <!DOCTYPE html> …

系列十九、Spring实例化bean的方式

一、概述 所谓实例化bean&#xff0c;大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种&#xff0c;即&#xff1a; ① 构造器方式&#xff1b; ② 静态工厂方式&#xff1b; ③ 实例工厂方式&#xff1b;…

SQL JOIN 子句:合并多个表中相关行的完整指南

SQL JOIN JOIN子句用于基于它们之间的相关列合并来自两个或更多表的行。 让我们看一下“Orders”表的一部分选择&#xff1a; OrderIDCustomerIDOrderDate1030821996-09-1810309371996-09-1910310771996-09-20 然后&#xff0c;看一下“Customers”表的一部分选择&#xff…

帮管客CRM 文件上传漏洞复现

0x01 产品简介 帮管客CRM是一款集客户档案、销售记录、业务往来等功能于一体的客户管理系统。帮管客CRM客户管理系统&#xff0c;客户管理&#xff0c;从未如此简单&#xff0c;一个平台满足企业全方位的销售跟进、智能化服务管理、高效的沟通协同、图表化数据分析帮管客颠覆传…

cuda magma 构建 使用cmake构建的步骤记录

这不是群论代数软件&#xff0c;而是cuda 矩阵计算软件 1. 生成其他精度的源代码 1.1 复制编辑 make.inc cp make.inc-examples/make.inc.openblas ./make.inc 并修改其中的定义&#xff1a; OPENBLASDIR ? /opt/OpenBLAS 这需要实现安装openblas到此处。文件夹解构&…

JAVA小游戏简易版王者荣耀

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;…

虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!

引言&#xff1a;探索AR的神奇世界&#xff0c;我们将从二维码的诞生谈起。在这个科技的海洋中&#xff0c;二维码是如何帮助AR实现数据获取与位姿识别的呢&#xff1f;让我们一起揭开这层神秘的面纱&#xff01; 一、二维码的由来 二维码是将数据存储在图形中的技术&#xff…

王者荣耀,,,,,

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 GameFrame 运行类 package com.sxt; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;…

【VSCode】自定义转换大小写快捷键

文章目录 VSCode 是没有可以直接转换字母大小写的快捷键的&#xff0c;但是可以通过设置去定义 点击左下角设置按钮&#xff0c;并选择键盘快捷方式 在快捷方式里面搜索写&#xff0c;就能找到&#xff1a; 选择要设置的快捷键&#xff0c;并点击左侧的号 在键盘上按住你想设置…

mysql高级知识点

一、mysql架构 连接层&#xff1a;负责接收客户端的连接请求&#xff0c;可以进行授权、认证(验证账号密码)。服务层&#xff1a;负责调用sql接口&#xff0c;对sql语法进行解析&#xff0c;对查询进行优化&#xff0c;缓存。引擎层&#xff1a;是真正进行执行sql的地方&#x…