【28】C语言 | 关于指针练习(2)

news2024/11/18 7:35:32

目录

10、下列关于二维数组输出

11、下列关输出

12、下列代码输出什么 

13、下列代码输出什么

14、下列代码输出什么

15、下列代码输出什么

16、下列代码输出什么

17、下列代码输出什么 

18、杨氏矩阵

19、左旋转两个字符


10、下列关于二维数组输出

int main()
{
    int a[3][4] = { 0 };

    printf("%d\n",sizeof(a)); //
    printf("%d\n",sizeof(a[0][0]));//
    printf("%d\n",sizeof(a[0]));//
    printf("%d\n",sizeof(a[0] + 1));//
    printf("%d\n",sizeof(*(a[0] + 1)));//
    printf("%d\n",sizeof(a + 1));//
    printf("%d\n",sizeof(*(a + 1)));//
    printf("%d\n",sizeof(&a[0] + 1));//
    printf("%d\n",sizeof(*(&a[0] + 1)));//
    printf("%d\n",sizeof(*a));//
    printf("%d\n",sizeof(a[3]));//

    return 0;
}
int main()
{
    int a[3][4] = { 0 };

    printf("%d\n",sizeof(a)); //48           - 3*4*4
    printf("%d\n",sizeof(a[0][0]));//4       - 第一行第一列元素的大小
    printf("%d\n",sizeof(a[0]));//16         - a[0]可以理解为第一行数组名,计算的是第一行的大小
    printf("%d\n",sizeof(a[0] + 1));//4      - 数组名字没有单独放在sizeof内部,a[0]为首元素地址,+1就为a[0][1]
    printf("%d\n",sizeof(*(a[0] + 1)));//4   - 第一个元素解引用+1,就是第一行第二个元素
    printf("%d\n",sizeof(a + 1));//4/8       - a是二维数组的数组名,没有取地址也没有单独放在sizeof内部
                                             //这里的a代表第一行的地址,+1就是第二行的地址
    printf("%d\n",sizeof(*(a + 1)));//16     - a+1 表示第二行的地址,解引用就是第二行的元素 即:*(a+1) <==> a[1]
    printf("%d\n",sizeof(&a[0] + 1));//4/8   - &a[0]是取第一行的地址,+1是第二行的地址
    printf("%d\n",sizeof(*(&a[0] + 1)));//16 - &a[0]是取第一行的地址,+1是第二行的地址,再解引用就是第二行的大小
    printf("%d\n",sizeof(*a));//16           - a没有取地址,也没有放到sizeof里面,就是首元素地址,二维数组的首元素地址是第一行
    printf("%d\n",sizeof(a[3]));//16         - a[3]是第四行,虽然没有第四行,但是通过类型知道它的一行有4个字符类型的元素

    return 0;
}

11、下列关输出

int main()
{
    short s = 5;
    int a = 4;
    printf("%d\n",sizeof(s=a+6)); 
    printf("%d\n",s); //5             

    return 0;
}
int main()
{
    short s = 5;
    int a = 4;
    printf("%d\n",sizeof(s=a+6)); //2  - 其决定作用的是s,所以这里算的是s的大小
    printf("%d\n",s); //5              - sizeof里的不做运算,所以这里的s还是5     

    return 0;
}

总结:数组名的意义

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

3.除此之外所有的数组名都表示首元素的地址。

12、下列代码输出什么 

int main()
{
    int a[5] = { 1,2,3,4,5 };
    int* ptr = (int*)(&a + 1);
    printf("%d,%d",*(a + 1), *(ptr - 1));

    return 0;
}
int main()
{
    int a[5] = { 1,2,3,4,5 };
    int* ptr = (int*)(&a + 1); //  -  &a是取真个数组a的地址,加1就是跨过整个数组即5的后面, (int*)即把它强制类型转换为int*
    printf("%d,%d",*(a + 1), *(ptr - 1)); // 2 ,5   - a为首元素地址加1就是第二个元素的地址,

    return 0;
}

13、下列代码输出什么

//这个结构体大小为20字节
//假设p 的值为0x100000,如下表达式的值分别是什么
struct Test 
{
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p
int main()
{
    printf("%p\n",p + 0x1);
    printf("%p\n",(unsigned long)p + 0x1);
    printf("%p\n",(unsigned int*)p + 0x1);

    return 0;
}
struct Test 
{
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p
int main()
{  
    printf("%p\n",p + 0x1); // 0x100014                - 结构体指针加1跨过一个结构体的大小
    printf("%p\n",(unsigned long)p + 0x1); // 0x100001 - 注意这个不是指针,加1就是加1
    printf("%p\n",(unsigned int*)p + 0x1); // 0x100004 - 强制转换成整形指针加1就跳过一个整形

    return 0;
}

14、下列代码输出什么

int main()
{
    int a[4] = {1,2,3,4};
    int * ptr1 = (int*)(&a + 1);
    int * ptr2 = (int*)((int)a + 1);

    printf("%x %x",ptr1[-1],*ptr2);

    return 0;
}
int main()
{
    int a[4] = {1,2,3,4};
    int * ptr1 = (int*)(&a + 1); //a是一个数组地址,加1就跳过数组的地址,即到“4”之后,强制转换成int*,所以ptr1就是指向4后面的地址
    int * ptr2 = (int*)((int)a + 1); //a是一个数组地址,被强制类型转换成int,在加1就是跳一个单位(指针加1才跳过一个指针类型),又被强制类型转换成指针

    printf("%x %x",ptr1[-1],*ptr2); //4   200000 按小端存储

    return 0;
}

15、下列代码输出什么

int main()
{
    int a[3][4] = {(0,1),(2,3),(4,5)}; 
    int* p;
    p = a[0];  
    printf("%d\n",p[0]);  

    return 0;
}
int main()
{
    int a[3][4] = {(0,1),(2,3),(4,5)}; //这是一个逗号表达式,可以看作{1,3,5}
    int* p;
    p = a[0];  //这里如果是p = a;那么才表示第一行的地址,这里是p = a[0];表示第一行首元素的地址
    printf("%d\n",p[0]);  // 1

    return 0;
}

16、下列代码输出什么

int main()
{
    int a[5][5];
    int (*p)[4];
    p = a;
    printf("%p,%d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
    return 0;
}

17、下列代码输出什么 

int main()
{
    int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
    int* ptr1 = (int*)(&aa + 1);
    int* ptr2 = (int*)(*(aa + 1));
    printf("%d,%d\n",*(ptr1 - 1),*(ptr2 - 1));  // 10 5

    return 0;
}

18、杨氏矩阵

题目内容

有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的

请编写程序在这样的矩阵中查找某个数字是否存在。

要求: 时间复杂度小于o(N) ;

//杨氏矩阵
//题目内容:
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
//请编写程序在这样的矩阵中查找某个数字是否存在。
//要求: 时间复杂度小于O(N) ;

int find_num(int arr[3][3],int r, int c, int k)
{
    int x = 0;
    int y = c - 1;
    while(x<r && y>=0)
    {
        if(arr[x][y] < k)
        {
            x++;
        }
        else if(arr[x][y] > k)
        {
            y--;
        }
        else
        {
            printf("所找的元素在第%d行 第%d列\n",x+1,y+1);
            return 1;
        }
    }
    return 0;
}
int main()
{
    int arr[3][3] = {1,2,3,4,5,6,7,8,9};
    int k = 7;
    int ret = find_num(arr,3,3,k);
    if(ret == 1)
    {
        printf("找到了\n");
    }
    else
    {
        printf("找不到\n");
    }

    return 0;
}

 怎么改一下不在函数里面输出,函数只返回1或0

//杨氏矩阵
//题目内容:
//有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的
//请编写程序在这样的矩阵中查找某个数字是否存在。
//要求: 时间复杂度小于O(N) ;

int find_num(int arr[3][3],int* px, int* py, int k)
{
    int x = 0;
    int y = *py - 1;
    while(x<*px && y>=0)
    {
        if(arr[x][y] < k)
        {
            x++;
        }
        else if(arr[x][y] > k)
        {
            y--;
        }
        else
        {
            return 1;
            *px = x;
            *py = y;
        }
    }
    return 0;
}
int main()
{
    int arr[3][3] = {1,2,3,4,5,6,7,8,9};
    int x = 3;
    int y = 3;
    int k = 7;
    int ret = find_num(arr,&x,&y,k);
    if(ret == 1)
    {
        printf("找到了\n");
        printf("所找的元素在第%d行 第%d列\n",x+1,y+1);
    }
    else
    {
        printf("找不到\n");
    }

    return 0;
}

19、左旋转两个字符

例如:abcdef ==> cdefab

#include<string.h>
void string_left_rotate(char* arr,int k)
{
    int i = 0;
    int len = strlen(arr);
    for(i=0;i<k;i++)
    {
        int tmp = *arr;     //每次左旋转一个字符
        int j = 0;          //后面的n-1个字符往前挪动
        for(j=0; j<len-1;j++)
        {
            *(arr+j) = *(arr+j+1);
        }
        *(arr + len -1) = tmp;
    }
}
int main()
{
    char arr[10] = "abcdef";
    int k = 2;
    string_left_rotate(arr,k);
    printf("%s\n",arr);

    return 0;
}

 或者

#include<string.h>
void reverse(char* left,char* right)
{
    int i = 0;
    while(right > left)
    {
        int tmp = *left;
        *left = *right;
         *right = tmp;
         left++;
         right--;
    }
}
void string_left_rotate(char* arr,int k)
{
    int n = strlen(arr);
    reverse(arr,arr+k-1);
    reverse(arr+k,arr+n-1);
    reverse(arr,arr+n-1);
}
int main()
{
    char arr[10] = "abcdef";
    int k = 2;
    string_left_rotate(arr,k);
    printf("%s\n",arr);

    return 0;
}

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

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

相关文章

文献阅读:Improving Language Understanding by Generative Pre-Training

文献阅读&#xff1a;Improving Language Understanding by Generative Pre-Training 1. 文章简介2. 模型介绍3. 实验考察 1. 训练数据2. 实验结果3. 消解实验 4. 总结 & 思考 文献链接&#xff1a;https://cdn.openai.com/research-covers/language-unsupervised/languag…

P1464 Function————C++

文章目录题目Function题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1解题思路Code运行结果题目 Function 题目描述 对于一个递归函数 w(a,b,c)w(a,b,c)w(a,b,c) 如果 a≤0a \le 0a≤0 或 b≤0b \le 0b≤0 或 c≤0c \le 0c≤0 就返回值$ 1$。如果 a>20a>20a&…

【Java】-【并发】

文章目录堆和方法区中的数据是可以被共享的堆中的数据是被栈中的变量所持用的&#xff0c;栈是线程隔离的&#xff0c;每个线程私有一个栈&#xff0c;所以栈中的数据不共享调用a方法时&#xff0c;jvm会给a方法创建一块内存区&#xff0c;让其入栈&#xff0c;这块区域被称为a…

linux(信号量)

信号量几个基本概念临界资源临界区原子性互斥信号量后台进程前台进程信号储存信号处理信号(信号捕捉)发送信号1、键盘产生&#xff1a;2、系统调用接口发送信号3、由软件条件产生信号4、硬件异常发送信号内核中的信号量**信号量在内核中的数据结构****信号集操作函数**信号的检…

YOLOv7 Falsk Web 监测平台 | YOLOv7 Falsk Web 部署

YOLOv7 Falsk Web 监测平台图片效果展示 YOLOv7 Falsk Web 监测平台视频效果展示 YOLOv7 Flask Web 检测平台 什么是Flask? 简介 Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开…

电子技术——MOS管的小信号模型

电子技术——MOS管的小信号模型 在上一节&#xff0c;我们已经学习过了MOS管的基本线性放大原理&#xff0c;本节我们继续深入MOS管的小信号放大&#xff0c;建立MOS管的小信号模型。 我们本节继续使用上节的电路&#xff0c;如下图所示&#xff1a; DC偏置点 根据上节的知识…

2.单例模式,工厂模式,建造者模式,原型模式

单例模式 单例模式的优点&#xff1a; 处理资源访问冲突表示全局唯一类 实现单例的关键&#xff1a; 构造函数需要是 private 访问权限的&#xff0c;这样才能避免外部通过 new 创建实例&#xff1b;考虑对象创建时的线程安全问题&#xff1b;考虑是否支持延迟加载&#xff1b…

Deformable DETR TBD范式的不二选择

TBD范式检测和跟踪是不分家的。当前,性能较优的目标检测方法大都基于Transformer来做,CNN在目标检测的表现逐渐走低。DETR是基于Transformer的目标检测开山作,其解决了霸榜的yolo系列一些令人讨厌的事情,不需要前处理和后处理,做到了真正意义上的end to end: 前处理:Anc…

测试做得好,犯错少不了【30个最容易犯的错误】谨记

最近跟一些刚刚进入软件测试行业的朋友去交流&#xff0c;发现了一个有趣的现象&#xff0c;就是对于这个行业的很多问题的认识都是一致的片面&#xff0c;当然也可以理解为误区。自己利用一点时间&#xff0c;把他们对于这个行业的认识误区都罗列出来&#xff0c;然后结合自己…

Centos7搭建Hadoop集群(V3.3.4)

Centos7搭建Hadoop集群V3.3.4一、准备工作1、配置hostname2、hosts映射3、关闭防火墙4、同步时间5、关闭selinux6、配置ssh免密登陆7、重启二、安装所需环境1、jdk安装2、hadoop安装三、修改配置hadoop-env.shcore-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlworkers四…

web测试1:在ubuntu中运行boa

参考文档&#xff1a; https://blog.csdn.net/feit2417/article/details/84777523 1.下载boa源码 Boa Webserver主页&#xff1a;Boa Webserver 下载链接&#xff1a;http://www.boa.org/boa-0.94.13.tar.gz 下载后&#xff0c;解压 tar zxvf boa-0.94.13.tar.gz。 文件列表…

Mysql-query优化之explainProfiling

1、explain 要对执行计划有个比较好的理解&#xff0c;需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分&#xff0c;分别是 应用层、逻辑层、物理层&#xff0c;不只是MySQL &#xff0c;其他大多数数据库产品都是按这种架构来进行划分的…

Spring的快速入门代码实现

Spring的快速入门代码实现前言&#xff1a;需要创建Maven的项目&#xff08;这个一定要看下面的链接&#xff09;1.如何创建Maven项目直达链接2.将这个项目的名字 命名为spring_ioc一、导入坐标&#xff08;pom.xml文件中实现&#xff09;1.1 代码&#xff1a;1.2 version的版本…

【GD32F427开发板试用】从0开始到RTthread移植

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;军军 写在前面: 很高兴获得这次试用机会&#xff0c;一直很想了解国内ARM MCU的发展&#xff0c;尤其是GD32系列的MCU。我也成功获得了第一次使…

PyQt5开发环境搭建 1.2 简单的例子

目录 基本开发步骤 创建Eric6工程目录 使用Qt Creator创建Qt项目 创建项目 Kit Selection 打开编辑窗口 打开form 放一个Label 拖动Label 放一个Button 拖动Push Button 保存UI文件 编译ui文件 当前项目下文件列表 将ui文件编译成py文件 将ui文件和py文件拷贝到…

学习记录678@项目管理之合同管理案例

案例 系统集成商 Simple 公司与生产型企业 Perfect 集团签订了一份企业MIS(管理信息系统)开发合同&#xff0c;合同已执行到设计和开发阶段&#xff0c;由于 Perfect 集团内部组织结构调整可能会影响核心业务的流程。集成商 Simple 公司提出建议&#xff0c;合同暂停执行至新的…

使用 Jenkins + Gitee + maven 自动化部署 Spring Boot

目录 1、前言 1 .1、插件简介 1.2、插件安装 2、创建Maven项目 2.1、新建一个全新的项目 2.2、拷贝已有项目 3、项目配置 3.1 、General 3.2、源码管理 3.3、构建触发器 3.4、构建环境 3.5、Pre Steps 3.6、Build 1&#xff09;Root POM 2&#xff09;Goals and…

kubenertes集群部署kubeadm方式

一、安装要求 1、3台机器&#xff09;&#xff0c;操作系统Centos7,5.4内核,CentOS 7.x 系统自带的3.10.x内核存在一些Bugs.导致运行的Docker.Kubernetes不稳定。 2、硬件配置:4GB内存&#xff0c;至少2个CPU或更多CPU&#xff0c;至少硬盘30GB或更多 3、集群中所有机器之间网…

41 锚框【动手学深度学习v2】】

41 锚框【动手学深度学习v2】】 锚框&#xff1a;对边框位置的猜测。 先提出多个框在某个地方&#xff0c;比如5个&#xff0c;然后去看这5个框里面到底有没有物体。 两次预测&#xff1a;锚框位置和锚框内物体的预测。 如何处理锚框&#xff1f; IoU - 交并比 比较两个框之…

Java开发实现图书管理系统(超详细)

本文用Java代码实现图书代码管理系统&#xff0c;有些地方可能会有纰漏&#xff0c;希望各位大佬鉴赏&#xff01;&#xff01; 文章目录 文章目录 一、Java实现图书管理系统 1.1创建book包 二、创建图书管理系统的操作包 2.1创建Operation接口 三、创建User包 3.1创建User类 四…