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

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.mfbz.cn/a/696063.html

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

相关文章

Tessy学习系列(三):单元测试——官方例程isValueInRange

一、工程创建 &#xff08;1&#xff09;新建工程 注意&#xff1a;工程名称以及路劲不能包含空格和中文 &#xff08;2&#xff09;新建测试集与单元测试模块 新建测试集 新建单元测试模块 设置测试模块为单元测试模块并选择GNU GCC编译器如果需要其他的编译器&#xff0c;…

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…

kubesz(一键安装k8s)

引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目&#xff0c;它基于 Ansible&#xff0c;通过提供一套简单、易用的配置&#xff0c;使得…

杨校老师项目之基于SpringBoot的理发店的预约管理系统

原系统是SSMJSP页面构成&#xff0c;先被修改为SpringBoot JSP页面 自助下载渠道: https://download.csdn.net/download/kese7952/89417001&#xff0c;或 点我下载 理发师信息&#xff1a; 理发师详细信息 公告信息 员工登录&#xff1a; 管理员登录

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

有点好玩的python运维脚本

python运维脚本 1. 常用端口扫描2. 文件整理 1. 常用端口扫描 在计算机网络中&#xff0c;端口是一个通信端点&#xff0c;允许不同的进程或服务通过网络连接和交换数据。端口通过数值来标识&#xff0c;并与特定的协议相关联。未采取适当安全措施而保持端口开放&#xff0c;可…

上位机图像处理和嵌入式模块部署(f407 mcu vs h750)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在目前工业控制上面&#xff0c;f103和f407是用的最多的两种stm32 mcu。前者频率低一点&#xff0c;功能少一点&#xff0c;一般用在低端的嵌入式设…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

GitLab代码导出 gitlab4j-api 实现

目录 GitLab简介 GitLab 的主要特点包括&#xff1a; GitLab代码导出 gitlab4j-api 添加 gitlab4j-api 依赖 使用 gitlab4j-api 获取特定命名空间下的所有项目 说明 注意事项 GitLab简介 GitLab 是一个开源的代码仓库和协作平台&#xff0c;主要用于版本控制和源代码管理…

堆和栈(heap and stack)

1、堆&#xff1a;一块内存空间&#xff0c;可以从中分配一个小buffer&#xff0c;用完后再把它放回去。 2、栈&#xff1a;也是一块内存空间&#xff0c;cpu的sp寄存器指向它&#xff0c;它可以用于函数调用、局部变量、多任务系统里保存现场。 PUSH [r3-r6,lr]; #将r3到r6寄…

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗 一.数据二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数三.其它 有人说未来几年,推理功耗能降低为现在的几万分之一,好奇怎么能做到呢 一.数据 二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数 import…

Docker Swarm集群部署管理

Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…

1035 插入与归并(测试点6)

solution 类型判断&#xff1a;插入排序中已排序的部分有序&#xff0c;未排序的和原数组元素相同&#xff1b;否则为归并排序测试点6&#xff1a;对于归并排序的子序列长度&#xff0c;不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…

C# BindingSource 未完

数据绑定导航事件数据验证自定义示例示例总结 在 C#中&#xff0c; BindingSource 是一个非常有用的控件&#xff0c;它提供了数据绑定的基础设施。 BindingSource 允许开发者将数据源&#xff08;如数据库、集合、对象等&#xff09;与用户界面控件&#xff08;如文本框、下…

测试基础12:测试用例设计方法-边界值分析

课程大纲 1、定义 经验发现&#xff0c;较多的错误往往发生在输入或输出范围的边界上&#xff0c;因为边界值是代码判断语句的点&#xff0c;一般容易出问题&#xff08;数值写错、多加或丢失等号、写错不等号方向…&#xff09;。所以增加对取值范围的边界数据的测试&#xff…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

车载电子电气架构 - 智能座舱技术及功能应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【Vue】请求动态渲染数据

目标 请求获取数据存入 vuex, 映射渲染 安装 axios yarn add axios准备actions 和 mutations App.vue页面中调用 action, 获取数据 验证数据是否存储成功 动态渲染 cart-item.vue

第2回 从0x7c00到0x90000

将数据段寄存器ds的值变成了0x07c0,方便了之后访问内存时利用这个段基址进行寻址,接下来,我们带着这两行代码继续往下看6行: 此时ds寄存器的值已经是0x07c0了,然后用同样的方式将es寄存器的值变成0x9000,接着又把cs寄存器的值变成256。 好的,此时ds,es,cx寄存器的值,都…

Vue学习|Vue快速入门、常用指令、生命周期、Ajax、Axios

什么是Vue? Vue 是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写 基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。官网:https://v2.cn.vuejs.org/ Vue快速入门 打开页面&#xff0…