C语言:指针2(指针变量指向数组)

通过指针引用数组元素

引用一个数组元素,可以用:
① 下标法:如 a[i] 形式。
② 指针法:如 *(a+i) 或者 *(p+i) 。其中a是数组名,p是指向数组元素的指针变量,其初值:p =
a;

案例
需求:有一整型数组a,有10个元素。输出数组中的全部元素。
分析:要输出各元素的值,有三种方法
下标法;通过改变下标输出所有元素

#include <stdio.h>
void main()
{
    int arr[10];
    int i;
    // 给数组元素赋值
    for(i = 0; i < 10; i++)
        scanf("%d",&arr[i]);
    // 遍历数组元素
    for(i = 0; i < 10; i++)
        printf("%-4d%",arr[i]);
    
    printf("\n");
        
}

指针法(地址):通过数组名计算出数组元素的地址,找出数组元素值

#include <stdio.h>
void main()
{
    int arr[10];
    int i;
    // 给数组元素赋值
    for(i = 0; i < 10; i++)
        scanf("%d",&arr[i]);
    // 遍历数组元素
    for(i = 0; i < 10; i++)
        printf("%-4d%",*(arr+i));
    
    printf("\n");        
}

指针法(指针变量):用指针变量指向数组元素

#include <stdio.h>
void main()
{
    int arr[10];
    int *p,i;
    // 给数组元素赋值
    for(i = 0; i < 10; i++)
        scanf("%d",&arr[i]);
    // 遍历数组元素
    for(p = arr;p < (arr + 10); p++)
        printf("%-4d%",*p);
    
    printf("\n");      
}

以上3种写法比较:
第①种写法和第②种写法执行效率相同。系统是将arr[i]转换为*(arr+i)处理的,即先计算出地
址,因此比较费时。
第③种方法比第①②种方法快。用指针变量直接指向数组元素,不必每次都重新计算地址。
(p++)能大大提高执行效率。
用第①种写法比较直观,而用地址法或者指针变量的方法难以很快判断出当前处理的元素。

使用指针变量指向数组元素时(上面第③种写法),注意以下三点:
① *(p--) 相当于arr[i--],先*p,再p--
② *(++p) 相当于arr[++i],先++p,再*
③ *(--p) 相当于arr[--i],先--p,再*

数组名作函数参数

表现形式:
1. 形参和实参都是数组名

void fun(int arr[],int len){..}
void main()
{
    int arr[] = {11,22,33};
    fun(arr,sizeof(arr)/sizeof(arr[0]));
}

2. 实参用数组名,形参用指针变量

void fun(int *p,int len){..}
void main()
{
    int arr[] = {11,22,33};
    fun(arr,sizeof(arr)/sizeof(arr[0]));
}

3. 实参形参都用指针变量

void fun(int *p,int len){..}
void main()
{
    int arr[] = {11,22,33};
    int *p = arr;
    fun(p,sizeof(arr)/sizeof(arr[0]));
}

4. 实参为指针变量,形参为数组名

void fun(int arr[],int len){..}
void main()
{
    int arr[] = {11,22,33};
    int *p = arr;
    fun(p,sizeof(arr)/sizeof(arr[0]));
}

数组指针与指针数组

数组指针

概念:数组指针是指向数组的指针,本质上还是指针
特点:
先有数组,后有指针
它指向的是一个完整的数组

一维数组指针:

语法:数据类型 (*指针变量名)[容量];

案例:

/**
 * 数组指针:指向数组的指针(这里不是指向数组元素的指针)
 */ 
#include <stdio.h>
int main(int argc,char *argv[])
{
    // 一维数组指针
    // 现有数组,再有指针
    int arr[] = {100,200,300};
    // 获取数组的元素个数
    int len = sizeof(arr) / sizeof(arr[0]);
    // 定义一个数组指针,指向arr这个数组int
     (*p)[3] = &arr; // 此时p不是指向arr数组的第一个元素,而是指向arr这个数组本身
    printf("%p\n",p);
    // p++; // 此时p++会跳出整个数组,访问到一块未知的内存,程序中尽量避免这种写法
    // printf("%p\n",p);
    // 如何访问访问数组指针
    printf("%d\n",(*p)[2]);// 300
    // 遍历
    for(int i = 0;i < len;i++)
   {
        printf("%d\n",(*p)[i]);
   }
    printf("\n");
    return 0;
}

二维数组指针:

语法:数据类型 (*指针变量名)[行容量][列容量];

案例:

写法1:

#include <stdio.h>
int main(int argc,char *argv[])
{
    // 创建一个普通的二维数组
    int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
// 创建一个二维数组指针
    // 一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
    int (*p)[3][3] = &arr;
    printf("%d\n",(*p)[1][0]);
    // 遍历
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]);i++)
   {
        int len = sizeof(arr[i])/sizeof(int);
        for(int j = 0; j < len; j++)
       {
            printf("%-4d",(*p)[i][j]);
       }
        printf("\n");
   }
    printf("\n");
    return 0;
}

写法2:

#include <stdio.h>
int main(int argc,char *argv[])
{
    // 创建一个普通的二维数组
    int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
    // 创建一个二维数组指针
    // 一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
    int (*p)[3] = arr; // 取二维数组的第一个元素 {10,20,30} 数组名本身就代表数组首元素(地址)
    printf("%d\n",(*p)[0]);// 10
    // 获取元素2000
    printf("2000-%d,%d,%d",*(*(p+2)+1),*(p[2]+1),p[2][1];// *(*(p+1)+2) 300
    return 0;
}

指针和数组中符号优先级: () > [] > *

指针数组

概念:指针数组是一个数组,数组中的每一个元素都是一个指针
特点:
先有指针,后有数组
指针数组的本质是一个数组,只是数组中的元素类型为指针

语法:数据类型 *数组名[容量];

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{
    // 定义三个变量
    int a = 10,b = 20,c = 30;
    // 定义指针数组,指针数组用来存放指针的
    int *arr[3] = {&a,&b,&c};
    // 获取数组大小
    int len = sizeof arr / sizeof arr[0];
    // 遍历数组
    for(int i = 0; i < len; i++)
        printf("%-3d",*arr[i]);// 输出每个指针指向的值,需要解引用
    
    printf("\n");
    return(0);
}

建议:我们一般使用指针数组处理字符串

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

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

相关文章

【D3.js in Action 3 精译_046】DIY 实战:在 Observable 平台利用饼图布局函数实现 D3 多个环形图的绘制

当前内容所在位置&#xff1a; 第五章 饼图布局与堆叠布局 ✔️ 5.1 饼图和环形图的创建 ✔️ 5.1.1 准备阶段&#xff08;一&#xff09;5.1.2 饼图布局生成器&#xff08;二&#xff09;5.1.3 圆弧的绘制&#xff08;三&#xff09;5.1.4 数据标签的添加&#xff08;四&#…

【案例80】麒麟操作系统无法使用Uclient访问NC65

问题现象 麒麟操作系统&#xff0c;安装Uclient&#xff0c;添加应用后无法看到登录界面&#xff0c;一直在转圈。 问题分析 进入到Uclient的工作目录 发现在工作目录下&#xff0c;无相关app.log生成。 查看Uclient的main.log发现&#xff0c;有大量的报错与Uclient下的sha…

阿里云OSS批量导出下载地址 OSS批量导出 OSS导出清单

阿里云官方提供的客户端不能批量导出下载地址&#xff0c;阿里云OSS批量导出下载地址 OSS批量导出 OSS导出清单 1、参数配置&#xff1a;填写阿里云的AccessKeyID和AccessKeySecret&#xff0c;在阿里右上角的用户获取 2、选择地域&#xff1a;就是你OSS开的是哪个地方的&…

【CSS in Depth 2 精译_084】第 14 章:CSS 蒙版、形状与剪切概述 + 14.1:CSS 滤镜

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 14 章 蒙版、形状与剪切】 ✔️ 14.1 滤镜 ✔️ 14.1.1 滤镜的类型 ✔️14.1.2 背景滤镜 ✔️ 14.2 蒙版 文章目录 第 14 章 蒙版、形状与剪切 Masks, shapes, and…

如何高效调试复杂布局?Layout Inspector 的 Toggle Deep Inspect 完全解析

Layout Inspector 是 Android Studio 提供的一个强大工具&#xff0c;用于分析和调试 Android 应用的 UI 布局。前置条件是app是debug调试状态&#xff0c;它允许你在应用运行时实时查看布局层次结构、UI 元素的属性&#xff0c;并帮助你诊断 UI 渲染问题。 Toggle Deep Inspe…

wxpython 基础代码

wxpython 基础代码 import wxclass MyFrame(wx.Frame):def __init__(self):super().__init__(parentNone, title计算器, size(450, 250))panel wx.Panel(self)# panel.SetBackgroundColour(wx.GREEN)self.icon1 wx.Icon(name"test.ico", typewx.BITMAP_TYPE_PNG)se…

2.5 io_uring

io_uring的相关函数接口介绍 io_uring 是 Linux 内核中一种高效的异步 I/O 接口&#xff0c;最早引入于 **Linux 内核 5.1** 版本。它是由 Jens Axboe 开发的&#xff0c;目的是提供更高效的异步 I/O 操作&#xff0c;尤其是相比 epoll 和 aio&#xff0c;io_uring 减少了系统…

服务器数据恢复—V7000存储中多块磁盘出现故障导致业务中断的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台V7000存储上共12块SAS机械硬盘&#xff08;其中1块是热备盘&#xff09;&#xff0c;组建了2组Mdisk&#xff0c;创建了一个pool。挂载在小型机上作为逻辑盘使用&#xff0c;小型机上安装的AIXSybase。 服务器存储故障&#xff1a; V7…

python 读取win7 win10本机ipv6 地址转发到电邮(备份)

python 版本&#xff1a; 3.8.10 用于外网查询SMB服务器ipv6 地址。服务器定时查询本机ipv6地址&#xff0c;如地址变动则用电邮发送新地址。 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import ssl import socket…

多个JAVA环境变量安装配置

在做java代码审计时&#xff0c;为了要成功运行目标环境&#xff0c;时长要对于jdk版进行切换&#xff0c;且在装多个jdk时还时长会遇到安装配置后环境变量不生效的情况&#xff0c;下文介绍&#xff1b; 1、为什么安装了新的jdk&#xff0c;有的时候环境变量中的jdk版本确还是…

数字经济下的 AR 眼镜

目录 1. &#x1f4c2; AR 眼镜发展历史 1.1 AR 眼镜相关概念 1.2 市面主流 XR 眼镜 1.3 AR 眼镜大事记 1.4 国内外 XR 眼镜 1.5 国内 AR 眼镜四小龙 2. &#x1f531; 关键技术 2.1 AR 眼镜近眼显示原理 2.2 AR 眼镜关键技术 2.3 AR 眼镜技术难点 3. &#x1f4a…

maven-resources-production:ratel-fast: java.lang.IndexOutOfBoundsException

Maven生产环境中遇到java.lang.IndexOutOfBoundsException的问题&#xff0c;尝试了重启电脑、重启IDEA等常规方法无效&#xff0c;最终通过直接重建工程解决了问题。 Rebuild Project 再启动OK

TDesign:NavBar 导航栏

NavBar 导航栏 左图&#xff0c;右标 appBar: TDNavBar(padding: EdgeInsets.only(left: 0,right: 30.w), // 重写左右内边距centerTitle:false, // 不显示标题height: 45, // 高度titleWidget: TDImage( // 左图assetUrl: assets/img/logo.png,width: 147.w,height: 41.w,),ba…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

ansible剧本快速上手

playbook剧本介绍 是什么&#xff1a;能户长期保存&#xff0c;且能实现批量配置、部署…的文件格式&#xff1a;yaml格式。用 空格 冒号 头号 句号语法检测&#xff1a;ansible-playbook --syntax-check install-zabbix.yaml或则 -C检测取消默认任务&#xff1a;gather_facts…

【LeetCode每日一题】——434.字符串中的单词数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【时空频度】八【代码实现】九【提交结果】 一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 434.字符串中的单词数 四【题目描述】 统计字符串中的单词个…

C++ OpenGL学习笔记(1、Hello World空窗口程序)

终于抽出时间系统学习OpenGL 教程&#xff0c;同时也一步一步记录怎样利用openGL进行加速计算。 目录 1、环境准备1.1、库的下载1.2、库的选择及安装 2、OpenGL第一个项目&#xff0c;Hello World!2.1、新建hello world控制台项目2.2、配置openGL环境2.2.1 包含目录配置2.2.2 …

MySQL复制问题和解决

目录 环境介绍 一&#xff0c;主库执行delete&#xff0c;从库没有该数据 模拟故障 修复故障 二&#xff0c;主库执行insert&#xff0c;从库已存在该数据 模拟故障 故障恢复 三&#xff0c;主库执行update&#xff0c;从库没有该数据 模拟故障 故障恢复 四&#xf…

AWTK 在树莓派 pico 上的移植笔记

1. 配置文件 (awtk_config.h) pico 和 stm32f103 的配置差不多&#xff0c;虽然 pico 的内存要大不少&#xff0c;但是也不足提供一个完整的 FrameBuffer&#xff0c;所以只能使用片段 LCD。 我们在 awtk-stm32f103 的配置 基础稍作修改即可。 /* 使用片段 LCD */#define FRA…

构建MacOS应用小白教程(打包 签名 公证 上架)

打包 在package.json中&#xff0c;dependencies会被打进 Electron 应用的包里&#xff0c;而devDependencies则不会&#xff0c;所以必要的依赖需要放到dependencies中。files中定义自己需要被打进 Electron 包里的文件。以下是一个完整的 mac electron-builder的配置文件。 …