C语言基础:指针(数组指针与指针数组)

news2024/12/27 5:23:07

数组指针与指针数组

数组指针

概念:数组指针是指向数组的指针,本质上还是指针

特点:

  • 先有数组,后有指针

  • 它指向的是一个完整的数组

一维数组指针:

  • 语法:

 数据类型 (*指针变量名)[行容量][列容量];
  • 案例:

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

我们之前所学的是指向数组元素的指针,本质上还是指针变量;现在我们学的是指向数组的指针,叫做数组指针。

二维数组指针:

  • 语法:

 数据类型 (*指针变量名)[容量];
  • 案例:

写法1:

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

写法2:

#include <stdio,h>
 int main()
 {
     //创建一个普通的二维数组
     int arr[][3] = {10,20,30,100,200,300,1000,2000,3000};
    int len = sizeof(arr)/sizeof(arr[0]);
     //创建一个二维数组指针
     //一个二维数组本质上还是一个一维数组,只不过它的元素也是数组
     int (*p)[3] = arr; // 10
     printf("%d",(*p)[0]); //10
     //获取元素2000
     //三种写法:内部为行,外部为列
     printf("2000-%d,%d,%d",*(*(p+2)+1),*(p[2]+1),p[2][1]);
     
    return 0;
 }
  • 指针和数组中符号优先级:()> [] > *

  • 通过指针引用多维数组

案例1

需求:用指向元素的指针变量输出二维数组元素的值

 #include  <stdio.h>
 //用指向元素的指针变量指向二维数组元素的值
 int main()
 {
     //定义一个普通的二维数组
     int arr[3][4] = {1,3,5,7,9,11,13,15,17,19.21.23};
     //定义一个指针变量,用来接收二维数组的元素值
     int *p = arr[0]; // &arr[0][0]
     //循环遍历
     for(;p < arr[0] + 12;p++)
     {
         //每4个换行
         if((p - arr[0]) % 4 ==0)
         {
             printf("\n");
         }
         printf("%-4d",*p)
     }
     printf("\n");
     return 0;
 }

案例2

需求:数组指针-输出二维数组任一行一列元素的值

#include <stdio.h>
 //数组指针-输出二维数组任一行一列元素的值
 int arr_main1()
 {
     //定义一个二维数组
     int arr[3][4] = {1,3,5,7,9,11,13,15,17,19.21.23};
     //创建一个一维的数组指针指向二维数组
     int (*p)[4] = arr; //等价于&arr[0] , p代表我们这个二维数组
     // 创建两个变量,代表我们对应数据的行和列
     int row,col;
     //通过控制台来输入
     printf("请输入行号和列号:\n");
     scanf("%d,%d",&row,&col);
     printf("arr[%d][%d] = %d\n",row,col,*(*(p+row)+col));//*(*(p+row)+col),*(p[row]+col),p[row][col]
 }
 int main()
 {
     return 0;
 }

指针数组

概念:指针数组是一个数组,数组中的每一个元素都是一个指针

特点:

  • 先有指针,后有数组

  • 指针数组的本质是一个数组,只是数组中的元素类型为指针

语法:

 数据类型 *数组名[容量];
 int *arr[4];//int (*arr)[4] 这个是数组指针
#include <stdio.h>
 int main()
 {
     // 定义三个变量
     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]);//输出每个指针指向的值,需要解引用
     }
     return 0;
 }

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

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

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

相关文章

接口测试Day03-postman断言关联

postman常用断言 注意&#xff1a;不需要手敲&#xff0c;点击自动生成 断言响应状态码 Status code&#xff1a;Code is 200 //断言响应状态码为 200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); });pm: postman的实例 test() …

01- 三自由度串联机械臂位置分析

三自由度串联机械臂如下图所示&#xff08;d180mm&#xff0c;L1100mm&#xff0c;L280mm&#xff09;&#xff0c;利用改进DH法建模&#xff0c;坐标系如下所示&#xff1a; 利用改进DH法建模&#xff0c;该机器人的DH参数表如下所示&#xff1a; 对该机械臂进行位置分析&…

lxml 解析xml\html

from lxml import etree# XML文档示例 xml_doc """ <root><book><title>Python编程指南</title><author>张三</author></book><book><title>Python高级编程</title><author>李四</autho…

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **计算每个玩家的牌型并找出赢家**9. **打印结果** 完整代码 以下游戏规则&#xff1a; 那…

基于 SpringBoot微信小程序的医院预约挂号系统

摘 要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;医院预约挂号系统当然不能排除在外。医院预约挂号系统是在实际应用和软件工程的开发原理之上&#xff0c;运用微信开发者、java语言以及…

高仿CSDN编辑器,前端博客模板

高仿CSDN编辑器纯前端模板&#xff0c;使用的js、html、vue、axios等技术&#xff0c;网络请求库已进行封装&#xff0c;可以按需调整界面,需要源码联系(4k左右)。 1.支持代码高亮 2.支持目录点击定位 3.支持文件上传、图片上传&#xff08;需要自己写后端接口&#xff09; 4.M…

【C++11】类型分类、引用折叠、完美转发

目录 一、类型分类 二、引用折叠 三、完美转发 一、类型分类 C11以后&#xff0c;进一步对类型进行了划分&#xff0c;右值被划分纯右值(pure value&#xff0c;简称prvalue)和将亡值 (expiring value&#xff0c;简称xvalue)。 纯右值是指那些字面值常量或求值结果相当于…

在线oj项目 Ubuntu安装vue/cil(vue脚手架)

参考:https://blog.csdn.net/weixin_66062303/article/details/129046198 笔记 参考:https://blog.csdn.net/m0_74352571/article/details/144076227 https://cli.vuejs.org/zh/guide/installation.html 确保nodejs已经安装 npm换源淘宝镜像&#xff08;可以不操作或者使用魔…

Python字符串及正则表达式(十一):正则表达式、使用re模块实现正则表达式操作

前言&#xff1a;在 Python 编程的广阔天地中&#xff0c;字符串处理无疑是一项基础而关键的技能。正则表达式&#xff0c;作为处理字符串的强大工具&#xff0c;以其灵活的模式匹配能力&#xff0c;在文本搜索、数据清洗、格式验证等领域发挥着不可替代的作用。本系列博客已经…

项目37:简易个人健身记录器 --- 《跟着小王学Python·新手》

项目37&#xff1a;简易个人健身记录器 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌…

华为:数字化转型只有“起点”,没有“终点”

上个月&#xff0c;我收到了一位朋友的私信&#xff0c;他询问我是否有关于华为数字化转型的资料。幸运的是&#xff0c;我手头正好收藏了一些&#xff0c;于是我便分享给他。 然后在昨天&#xff0c;他又再次联系我&#xff0c;并感慨&#xff1a;“如果当初我在进行企业数字…

count(1)、count(_)与count(列名)的区别?

大家好&#xff0c;我是锋哥。今天分享关于【count(1)、count(_)与count(列名)的区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; count(1)、count(_)与count(列名)的区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 SQL 中&#xff0c…

AAAI-2024 | 大语言模型赋能导航决策!NavGPT:基于大模型显式推理的视觉语言导航

作者&#xff1a;Gengze Zhou, Yicong Hong, Qi Wu 单位&#xff1a;阿德莱德大学&#xff0c;澳大利亚国立大学 论文链接&#xff1a; NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models &#xff08;https://ojs.aaai.org/index.p…

Linux高级--2.4.1 网络概念(分层、TCP)

关于网络分层理解的难点 对于一般人&#xff08;不参与设计和维护网络协议栈的人&#xff09;来讲&#xff0c;物理层和应用层很容易理解&#xff0c;也很好记住。首先&#xff0c;物理层是看的到的网线、基站的实体。再者&#xff0c;应用层是用户自己参与编写的程序。 而那…

使用VSCode Debugger 调试 React项目

一般我们调试代码时&#xff0c;用的最多的应该就是console.log方式了&#xff0c;还有的是使用Chrome DevTools 通过在对应的 sourcemap代码位置打断点进行调试&#xff0c;除了上面两种方式外还有一种更好用的调试方式&#xff1a; VSCode Debugger。 VSCode Debugger可以直…

Redis-十大数据类型

Reids数据类型指的是value的类型&#xff0c;key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分大小写 &#xff0c;key和value区分 查看当前库所有的key keys * 判断某个key是否存在 exists key 查看key是什…

Git--tag标签远程管理

目录 一、git 标签 tag管理 1.创建一个轻量级标签 2.创建一个带有附注的标签 3.删除标签 二、标签推送 1.再创建两个分支 2.把多个标签推送到远程 三、标签拉取 四、删除远程标签 1.命令 2.查看远程仓库&#xff0c;标签被删除 3.远程标签删除后本地标签不会消失&a…

通过nginx设置一个图片服务器,并使用 Nginx 作为反向代理

通过nginx设置一个图片服务器&#xff0c;并使用 Nginx 作为反向代理 安装nginx 首先需要去官网下载一个nginx&#xff0c;我这里下载了最新的稳定版本&#xff1a;nginx-1.26.2&#xff0c;下载下来是一个压缩包&#xff0c;解压之后就可以直接用了。 修改nginx的配置文件 …

第十六届“蓝桥杯”全国软件和信息技术专业人才大赛简介及资料大全

蓝桥杯全国软件和信息技术专业人才大赛是由工业和信息化部人才交流中心主办的一项全国性竞赛&#xff0c;面向全国高校大学生&#xff0c;累计参赛院校超过1200余所&#xff0c;参赛人数达40万人&#xff0c;是我国极有影响力的高校IT类赛事。 “第十六届蓝桥杯全国软件和信息…

快速理解24种设计模式

简单工厂模式 建立产品接口类&#xff0c;规定好要实现方法。 建立工厂类&#xff0c;根据传入的参数&#xff0c;实例化所需的类&#xff0c;实例化的类必须实现指定的产品类接口 创建型 单例模式Singleton 保证一个类只有一个实例&#xff0c;并提供一个访问他它的全局…