11-数组与指针深入理解——题型理解

news2024/11/29 0:35:06

11-数组与指针深入理解——题型理解

文章目录

  • 11-数组与指针深入理解——题型理解
    • 一、理解题1
    • 二、理解题二
    • 三、理解题三
    • 四、理解题四
    • 五、理解题五
    • 六、理解题六

一、理解题1

#include <stdio.h>

int main(void)
{
 int (*p)[5] = NULL; // 定义一个指向 拥有5个整型数据的数组
 int arr[5] = {1,2,4,5,7};
 p = &arr; //指向arr数组的首地址(整个数组的首地址)

 printf("arr    = %p\n",arr );    
 printf("&arr   = %p\n",&arr );    
 printf("p      = %p\n",p);        
 printf("*p     = %p\n",*p );      
 printf("p+1    = %p\n",p+1 );    
 printf("(*p)+1 = %p\n",(*p)+1);  
 printf("(**p = %p\n",**p);  


 int a;//a是一个随机数
 printf("%p\n%p\n",a,&a );
 
 return 0;
}

输出:
在这里插入图片描述

二、理解题二

#include <stdio.h>

int main(void)
{

    int a[5] = {1,2,3,4,5};
    int b[3][4] = { {250,2,3,4}, {5,6,7,8}, {9,10,11,12}};

    printf("&a: %p\n",&a);  //数组的首地址     
    printf("&a+1:   %p\n",&a+1);     //数组的地址+1 加一整个数组的大小 这里是加20B
    printf("a:  %p\n",a); //首元素首地址           
    printf("a+1:    %p\n",a+1);  //第二个元素的地址

    printf("\n");
    printf("&b: %p\n",&b);  //数组的首地址     
    printf("&b+1:   %p\n",&b+1);//数组的地址+1 加整个二维数组的大小     
    printf("\n");
    printf("b:  %p\n",b); //二维数组中第一个元素的地址b[0][0]的地址 但是其实表示的是第一个元素(250,2,3,4)的地址    
    printf("b+1:    %p\n",b+1);//由上面的b的解析可知,这里加一应该是加一个元素(250,2,3,4)的地址   ,所以是{5,6,7,8}的首地址
    printf("\n");
    printf("*b: %p\n",*b);  //因为b指的是(250,2,3,4)的地址,所以*b指的是250的地址   
    printf("*b+1:   %p\n",*b+1);  //由上面的解析可知,*b+1 应该是增加一个“250 ”类型的地址,也就是增加一个整型的地址   
    printf("\n");
    printf("**b:    %d\n",**b); // *b 是 250的地址,**b则是250的值  
    printf("**b+1:  %d\n",**b+1); //**b是数值250,然后在这个值上+1 ,所以为2 与原数组第二个元素无关  


    printf("**(b+1):%d\n",**(b+2)); // b+2是增加两个元素的地址,也就是{9,10,11,12}的地址,*(b+2)是这9的地址,**()就是取出这个9 的值 

    printf("*(*(b+2)+2):%d\n",*(*(b+2)+2));  //b+2是{9,10,11,12}的地址,*(b+2)是9的地址,*(b+2)+2 是在9的地址的基础上加两个int型的地址也就是11的地址,然后*()就是取出11的值


    // 使用指针来访问二维数组的每一个元素
    for (size_t i = 0; i < 12; i++)
    {
        printf("%d\t" ,*((*b)+i) );
    }
    
    // 使用数组来访问二维数组
    for (size_t i = 0; i < 3 ; i++)
    {
        for (size_t j = 0; j < 4; j++)
        {
            printf("b[%d][%d]:%d\t" , i , j , b[i][j] );
        }
        
    }
    

    // *((*b)+i)

    return 0;
}

输出:
在这里插入图片描述

三、理解题三

#include <stdio.h>

int main(void)
{
    int arr[] = { 1, 3, 5, 7, 9};
    int i, *p = arr, len = sizeof(arr) / sizeof(int);


    for(i=0; i<len; i++)
    {
        //   * 和 ++ 得优先级是同级的 , 又因为当前这一级的结合性是从右往左 , 因此先 p++  , 但是是后缀所以先运算后++
        printf("%d\n", *p++ );   // 先运算得到 1  , 然后再地址+1 
        printf("%d\n", (*p)++ );  // 先得到p得内容  3 , 然后再对3进行自加
        for (size_t j = 0; j < len ; j++)
        {
            printf("arr[%d]:%d\t" , j , arr[j]);
        } 
        printf("\n");

    }
    printf("\n");
 

    


    return 0;
}

输出
在这里插入图片描述

四、理解题四


#include <stdio.h>

int main(void)
{
    int a = 1, b = 2, c = 3;
    int *arr[3] = {&a, &b, &c};//定义一个名字为arr的数组,数组中存放的是int 型指针,--> 整型指针数组
    int **parr = arr; // 第一部分 *p , 第二部分 int * 说明类型   为指针类型   +1 则+1个指针类型 8字节(64)

    //            arr[0]  --> &a   *&a --> a 
    printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);
    printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));
    return 0;
}

五、理解题五

#include <stdio.h>

int main(void)
{
    char *lines[5] =       //字符指针数组--> 创建一个名字为lines的数组,用来存放char * 指针
    {
  "COSC1283/1984",
  "Programming",
  "Techniques",
  "is",
  "great fun"
    };
 
    char *str1 = lines[1];  //   用来存放数组第一个元素的首元素的首地址    --》Programming
    char *str2 = *(lines + 3); //==>*lines[3]  输出 is
    char c1    = *(*(lines + 4) + 6);  //*(lines + 4)-->"great fun"的地址 +6 就是 字符 f 的地址 再取值
    char c2    = (*lines + 5)[5]; //*lines  --> "COSC1283/1984"中的C的地址,+5 得到2的地址, [5]--》以2为基础再往后+5个单位并取值为9
 
    char c3    = *lines[0] + 2;//先lines[0]得到C的地址,*则取值为C,+ 2 --》 C+ 2 = E
 
    printf("str1 = %s\n", str1);   
    printf("str2 = %s\n", str2);   
    printf("c1   = %c\n", c1);     
    printf("c2   = %c\n", c2);    
    printf("c3   = %c\n", c3);    
 
    return 0;
}

在这里插入图片描述

六、理解题六

#include <stdio.h>

int main(void)
{
 int i;
 int num;
 int (*p)[5] = NULL;  //数组指针   
 int arr[5] =  {5,2,4,5,7};
 p = &arr;
 
 printf("=====================================\n");
 num = sizeof(arr)/sizeof(arr[0]);
 for(i=0;i<num;i++)
 {
  printf("*p[%d] = %d\n",i,*p[i]);//根据优先级应该是先p[i]然后再取值。P是一个数组指针,它的类型是数组,+1是增加一个数组,所以输出只有第一个是正常的,后面的都越界了。
 }
 printf("=====================================\n");
  for(i=0;i<num;i++)
 {
  printf("*(p+%d) = %p\n",i,*(p+i));  //打印👆的地址,同理p为一个数组指针,+i 是增加一个数组的大小也就是五个整型,20个字节
 } 
 printf("=====================================\n");
 
 for(i=0;i<num;i++)
 {
  printf("p[%d] = %p\n",i,p[i]); // == *(p+i)  和前面的一样  
 }
 printf("=====================================\n");
 
 for(i=0;i<num;i++)
 {
  printf("(*p)[%d] = %d\n",i,(*p)[i]); //正确输出,先*p 得到首元素地址,首元素首地址[i],以首元素的地址为基准值进行单位的增加
 }
 
 return 0;
}

输出:
在这里插入图片描述

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

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

相关文章

Linux---sudo命令

文章目录 目录 文章目录 一.sudo命令简介 二.sudo 命令的特点 三.sudo 相关文件 四.sudo 命令授权配置 一.sudo命令简介 sudo 命令全称“SuperUser Do”&#xff0c;是Linux系统中的一个命令能够使普通用户以超级用户身份去执行某些命令。 二.sudo 命令的特点 sudo能够授权…

翻译《The Old New Thing》- How do I obtain the computer manufacturer’s name?

How do I obtain the computer manufacturers name? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20081218-00/?p19783 Raymond Chen 2008年08月08日 如何获取计算机制造商的名字&#xff1f; 一位客户想要一种方法来确定计算机制造商的…

vuInhub靶场实战系列--prime:2

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

Flutter中同步与异步

一&#xff0c;同步/异步的理解 1&#xff0c;await&#xff1a;同步机制 同步操作会阻止其他操作执行&#xff0c;直到完成为止。同步就好比打电话一样&#xff0c;打电话时都是一个人在说另一个人听&#xff0c;一个人在说的时候另一个人等待&#xff0c;等另一个人说完后再…

OCP-042之:Oracle结构体系

1. Oracle结构体系 1.1 概述 1.1.1 版本 版本后缀所代表的含义 i:代表基于Internet架构的数据库,如9i g:代表基于grid(网格)的数据库,如11g grid的目的:降低成本,提高服务质量,简化管理 Storage Grid:ASM(automatic storage management),继承了LVM技术,Oracl…

Git【版本控制和Git的安装介绍】

01 【版本控制和Git的安装介绍】 工程设计领域中&#xff0c;使用“版本控制”管理工程蓝图的设计过程。在 IT 开发中也可以使用版本控制思想管理代码的版本迭代。 1.目的 协同修改&#xff1a;支持在服务器对同一个文件多人协同地修改&#xff1b; 数据备份&#xff1a;同时…

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序&#xff0c;在程序发生异常时就可以执行预先设定好的处理程序&#xff0c;处理程序执行完之后&#xff0c;可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…

11 gpio 与 pinctrl 子系统

1、GPIO 硬件结构 GPIO 是通用输入/输出端口的简称。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 八种工作模式 GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入GP…

Hadoop笔记

1.hadoop环境搭建&#xff0c;linux命令&#xff08;vi);2.分布式的基本概念&#xff0c;cap理论&#xff08;遵循此原则开发分布式数据库&#xff09;&#xff0c;hdfs,mapreduce&#xff1b;3.3.1&#xff1b;3.2重点&#xff1b;4.map&#xff0c;reduce过程&#xff0c;优缺…

DBeaver无法连接Clickhouse,连接失败

DBeaver默认下载的是0.2.6版本的驱动&#xff0c;但是一直连接失败&#xff1a; 报错提示 解决办法 点击上图中的Open Driver Configuration点击库 - 重置为默认状态在弹出的窗口中修改驱动版本号为0.2.4或者其他版本&#xff08;我没有试用过其他版本&#xff09;&#xff0…

c++【入门】求圆环的面积

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 如下图所示的圆环铁片&#xff0c;中间是空心的&#xff0c;已知圆环外圆的半径是r1厘米&#xff08;如&#xff1a;10cm&#xff09;&#xff0c;内圆半径是r2厘米&#xff08;如&#xff1a;6cm&#xff09;&#xff0c;请编…

stm32最小系统焊接调试总结

stm32最小系统打板后,接下来开始焊接元器件,焊接元器件可以参考立创EDA焊接辅助工具。 图1 焊接辅助助手 焊接准备工具有,焊台,放大镜,元器件,镊子,焊锡膏,锡丝及万用表等。调节焊台温度到350-400摄氏度。焊接顺序是先焊接USB typec接口,5V电源,ldo,ch340,stm32芯片…

标准发布实施 | 《村镇污水处理一体化集成装备技术规范》

根据《中华人民共和国标准化法》以及国家标准化管理委员会、民政部联合制定的《团体标准管理规定》&#xff0c;依据全国团体标准信息平台和《中华环保联合会团体标准管理办法&#xff08;试行&#xff09;》&#xff0c;全国团体标准《村镇污水处理一体化集成装备技术指南》&a…

32.768k晶振FC-135R在智能手表手环中的作用

随着智能设备的普及&#xff0c;智能手表和手环已经成为人们日常生活中不可或缺的科技产品。晶振在智能手表手环中的作用是通过传感器给智能手环连接提供信号频率&#xff0c;是很重要的核心部位&#xff0c;这些设备的核心在于其精准的时钟管理和低功耗特性&#xff0c;32.768…

Polar Web【中等】xxe

Polar Web【中等】xxe Contents Polar Web【中等】xxe思路&探索EXP运行&总结 思路&探索 如题目所示&#xff0c;此题考查XXE漏洞&#xff0c;具体细节需要逐步深挖 打开站点&#xff0c;提示了flag所在的文件&#xff0c;点击按钮&#xff0c;可见php的配置信息&am…

【CS.DB】深度解析:ClickHouse与Elasticsearch在大数据分析中的应用与优化

文章目录 《深入对比&#xff1a;在大数据分析中的 ClickHouse和Elasticsearch》 1 介绍 2 深入非关系型数据库的世界2.1 非关系型数据库的种类2.2 列存储数据库&#xff08;如ClickHouse&#xff09;2.3 搜索引擎&#xff08;如Elasticsearch&#xff09;2.4 核心优势的归纳 3…

[word] word文字间隙怎么调整? #媒体#职场发展

word文字间隙怎么调整&#xff1f; 在文档中的数据包含英文、数字、中文等&#xff0c;会有间隙&#xff0c;有时候误以为是空格&#xff0c;但是根本删除不了&#xff0c;其实这是默认的间隙&#xff0c;是可以调整的&#xff0c;下面教大家word文字间隙怎么调整的操作&#…

【Modelground】个人AI产品MVP迭代平台(4)——Mediapipe视频处理网站介绍

文章目录 介绍模型配置输入输出核心实现&#xff08;源码&#xff09;总结 介绍 这篇文章我将硬核介绍Modelground的第一个产品——Mediapipe视频处理&#xff01;网站入口为https://tryiscool.space/ml-video/&#xff0c;如图所示&#xff0c;欢迎体验。 tip: 由于服务器带宽…

以客户为中心:消费电子行业的产品研发之道

在消费电子行业这片快速变化的领域中&#xff0c;产品的迭代更新和技术的创新是推动行业不断前进的动力。然而&#xff0c;随着市场的日益成熟和消费者需求的多样化&#xff0c;如何确保产品能够满足目标用户的需求&#xff0c;成为摆在每一个产品研发团队面前的难题。本文将探…

理解JVM内存模型与Java内存模型(JMM)

理解JVM内存模型与Java内存模型&#xff08;JMM&#xff09; 在Java程序的运行过程中&#xff0c;内存管理和线程的同步是两个重要的概念。本文将深入探讨JVM内存模型&#xff08;Java Virtual Machine Memory Model&#xff09;和JMM&#xff08;Java Memory Model&#xff0…