C语言 指针进阶学完指针必看练习题详解

news2025/1/16 8:57:10

该篇与上篇衔接

二维数组

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//48   3*4*sizeof(int)
	printf("%d\n", sizeof(a[0][0]));//4   第一行第一个元素  就是整形大小
	printf("%d\n", sizeof(a[0]));//16
	//a[0]就可以理解为 第一行数组名 
	//sizeof(a[0])数组名a【0】单独放在sizeof内部 a【0】表示整个第一行
	//sizeof(a[0])计算的就是第一行的大小

	printf("%d\n", sizeof(a[0]+1));//4/8  符合sizeof规则第三条 所以他叔第一行第一个元素的地址
	printf("%d\n", sizeof( * (a[0] + 1)));//4     第一行第二个解引用 , 的到元素
	printf("%d\n", sizeof(a+1));//4/8   对于二维数组来说 首元素就是第一行
	printf("%d\n", sizeof(*(a+1)));//16   *(a+1)->a[1]
	printf("%d\n", sizeof(&a[0]+1));//  4/8
	printf("%d\n", sizeof(*(&a[0] + 1)));// 16
	printf("%d\n", sizeof(*a));// 16    a是代表整个数组  *a 代表的是对第一行解应用 得到的是第一行的数组
	printf("%d\n", sizeof(a[3]));//16  既然a[3]存在它的类型就是int()[4] 假象他是一个第四行











	

	return 0;
}

int main()
{
	short s = 5;
	int a = 4;
	printf("%d", sizeof(s = a + 6));//2   最后的结果由short而定  short2个字节。sizeof内部表达式不参与运算

	printf("%d", s);//5



	return 0;
}

第三个解析
在这里插入图片描述

指针笔试题

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&a + 1);
    printf( "%d,%d", *(a + 1), *(ptr - 1));
    return 0;   //第一个打印:a的地址没变 指向一 加一指向2的地址
}
//程序的结果是什么?
//2  5

解析
在这里插入图片描述


//由于我还没介绍过结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	
	printf("%p\n", p + 0x1);//相当于p+1   加1跳过一个类型 结构体类型20个字节直接跳过所以是加20  0x100000+20=0x100014   4成16的0次方。。。
	printf("%p\n", (unsigned long)p + 0x1);//0x100001   正数加1就是1  不跟指针一样
	printf("%p\n", (unsigned int*)p + 0x1);//0x100004    +4  一个整形字节
	return 0;
}

int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int* ptr1 = (int*)(&a + 1);
    int* ptr2 = (int*)((int)a + 1);// a转化为整形  一个整形4个字节   加1是加一个字节

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

在这里插入图片描述
在这里插入图片描述
%x打印打印16进制 只打印有效数组所以结果为4 2000000


#include <stdio.h>
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    int* p;
    p = a[0];
    printf("%d", p[0]);
    return 0;
}

解析

#include <stdio.h>
int main()
{
    int a[3][2] = { (0, 1), (2, 3), (4, 5) };//用了小括号表示是逗号表达式  相当于就放了{1,3,5}第一行放了1  3  第二行5 0 第三行00
    int* p;
    p = a[0];//没有& 也没放在sizeof内部 所以他代表首元素地址  1 放到了整形指针
    printf("%d", p[0]);//结果1      *(p+0)
    return 0;
}//a[0]表示第一行,然后没有&,也没有sizeof,所以是首元素,加起来就是a[0]这一行的首元素

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

    return 0;
}
int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;//int (*)[5]
    printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    //&p[4][2] 可以理解为 (*(p+4)+2)  解引用相当于从当前位置访问一个数组  刚好int四个 然后加2

    return 0;
}

**结果FFFFFFFC,4 **

C是12

//&p[4][2] 可以理解为 (*(p+4)+2) 解引用相当于从当前位置访问一个数组p[4] 刚好int四个 然后加2
在这里插入图片描述
指针-指针 得到指针见的元素个数
在这里插入图片描述
因为地址由低到高变化小地址减去大地址所以是-4

-4以%d打印就是-4 认为内存里放的有符号整数 以%p打印认为内存里是个地址 所以将地址补码直接拿出来 因为%p所以以16进制书写 4个1是一个f如下
- 4 写到内存就是
10000000000000000000000000000000100
111111111111111111111111111111111111011
111111111111111111111111111111111111100


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", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}
int main()
{
    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* ptr1 = (int*)(&aa + 1);//10   赋给ptr1的时候他就是个整形了  下面的-1是减去一个整形  所以打印10
    int* ptr2 = (int*)(*(aa + 1));//5  对第二行解引用拿到第二行  拿到第二行相当于拿到数组名。可以写成aa[1]  他就是6的地址 本身是个整形在解引用整形无意义
    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
    return 0;
}

#include <stdio.h>

int main()
{
	char* a[] = { "work","at","alibaba" };
	char** pa = a;
	pa++;
	printf("%s\n", *pa);
	return 0;
}

在这里插入图片描述

int main()
{
	char* a[] = { "work","at","alibaba" };//数组名表示首元素地址  首元素地址表示char*   
	char** pa = a;//相当于pa指向第一个的char*
	pa++;//指向“at”的char*   pa指向数组,+1指向下一个元素
	printf("%s\n", *pa);//解引用at  从这里向后打印字符串
	return 0;
}//at


int main()
{
	char* c[] = { "ENTER","NEW","POINT","FIRST" };
	char** cp[] = { c + 3,c + 2,c + 1,c };
	char*** cpp = cp;

	printf("%s\n", **++cpp);
	printf("%s\n", *-- * ++cpp + 3);
	printf("%s\n", *cpp[-2] + 3);
	printf("%s\n", cpp[-1][-1] + 1);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

第一次解引用拿到c+2 第二次拿到了 char*内容 所以打印 POINT

在这里插入图片描述

printf("%s\n", *-- * ++cpp + 3);//++优先级高   --就是对c+1  减去1 后变成c 如果是c 指向位置也会发生改变 再解引用拿到 ENTER 加3 指向T。从E向后打印打印结果ER

*cpp[-2]可以写成 **(cpp-2) +3指向R打印ST
在这里插入图片描述

printf("%s\n", cpp[-1][-1] + 1);//cpp[-1][-1] 可以写成 (*(*(cpp-1)-1)+1   结果EW

在这里插入图片描述

总体打印结果POINT ER ST EW

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

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

相关文章

Windows卸载easyconnect

Windows卸载easyconnect卸载深信服VPN客户端easyconnect解决办法卸载SangforPWEx服务手动卸载安装目录卸载深信服VPN客户端easyconnect Windows下的深信服VPN客户端easyconnect无法卸载. 解决办法 下载地址: http://download.sangfor.com.cn/download/product/sslvpn/Sangfor…

浅谈图数据库1:什么是图?

目录 一、图是什么&#xff1f; 二、“图”源自哪里&#xff1f; 三、加权图是什么&#xff1f; 四、有向图是什么&#xff1f; 五、图能给我们带来什么&#xff1f; 一、图是什么&#xff1f; 说到“图” 大部分人首先想到的是这样滴——图像 ​或者是 饼状图 折线图…

【ML实验4】多分类贝叶斯模型

实验代码获取 github repo 山东大学机器学习课程资源索引 实验目的 实验内容 数据集 构建多分类贝叶斯模型 这里的条件独立性指的是特征xjx_jxj​之间相互独立&#xff0c;这是一个十分强的假设。 证明 Problem Set 2 思路主要是证明下面引理&#xff0c;用拉格朗日乘子法&a…

CP2102国产替代DPU02— USB 转 UART 桥接芯片

DPU02是一个高度集成的USB转UART的桥接控制器&#xff0c;该产品提供了一个简单的解决方案&#xff0c;可将RS-232设计更新为USB设计&#xff0c;并简化PCB组件空间。该DPU02包括了一个USB 2.0全速功能控制器、USB收发器、振荡器、EEPROM和带有完整调制解调控制信号的异步串行数…

【聆思CSK6视觉AI开发套件试用】Win11下安装全过程处理兼容性问题以及实现亮灯AI头肩检测

本篇文章来自极术社区与聆思科技组织的CSK6 视觉AI开发套件活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Wordiansom Win11上并且安装在其他盘的时候会出现的问题坑。。。。。。&#xff08;能用win10就用win10&#xff09;。 1. 晚拿到的开发板套件…

冲量在线携手中国电信研究院、北京电信和海光信息打造的数信链网的入选2022“星河”隐私计算标杆案例

为促进大数据技术产品及相关产业发展&#xff0c;加快培育数据要素市场、充分发挥数据作为生产要素的独特价值&#xff0c;树立行业标杆榜样力量&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续六年共同组织大数据“星河&#xf…

Java8 Stream流

目录Java8 Stream流一、Stream概述二、Stream 的创建&#xff08;4种方式&#xff09;参考地址&#xff08;表示感谢&#xff09;&#xff1a;Java8 Stream流 一、Stream概述 Stream API说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则是 St…

Gradle Plugin的开发及发布

Gradle Plugin的开发及发布前言插件的开发学习阶段&#xff08;build.gradle脚本&#xff09;开发阶段&#xff08;buildSrc&#xff09;PluginTaskExtension发布阶段&#xff08;独立module&#xff09;发布到本地发布到MavenCentral准备sonatype账号创建pgp证书配置sonatype和…

数据结构与算法基础(王卓)(6):带尾指针(单向)循环链表的合并;双链表及其插入和删除的详细操作

带尾指针&#xff08;单向&#xff09;循环链表的合并 PPT(157)&#xff1a; 操作前初始设定预设的条件​​​​我们要做的&#xff0c;即&#xff1a; 让A表尾节点指向B表首结点&#xff0c;让B表尾节点指向A表首结点&#xff1a; Project 1&#xff1a; Status 合并链表(…

NVIDIA NCCL 源码学习(九)- 单机内ncclSend和ncclRecv的过程

上节介绍了通信链路的建立过程&#xff0c;本节介绍下单机内部ncclSend和ncclRecv的运行过程。 单机内的通信都是通过kernel来进行的&#xff0c;所以整个通信的过程可以分为两步&#xff0c;第一步是准备kernel相关的参数&#xff0c;第二步是实际执行kernel的过程。 为方便…

闯关(贪心)

某综艺频道推出了一个闯关活动。 活动一共包含 n 个关卡&#xff08;编号 1∼n&#xff09;&#xff0c;其中 m 个关卡为特殊关卡。 每个关卡都有一个通关分数&#xff0c;其中第 i 个关卡的通关分数为 ai。 挑战者可以自由决定所有关卡的具体挑战顺序&#xff0c;并且每通过…

【工具类】Elasticsearch的HTTP客户端(Java)

一、介绍 1. 原理 Java基于Http请求操作ES&#xff0c;与Kibana上的操作一致。 Kibana上的dsl与Http的关系&#xff1a; GET、POST等同于HTTP的POSTPUT 等同于HTTP的PUTDELETE 等同于HTTP的DELETE 如图 该DSL可转化为HTTP请求 POST ip:port/docwrite/_search 请求体为&…

Mysql online DDL工具:gh-ost

gh-ost特点&#xff1a; 1、不使用触发器。 在gh-ost出现之前第三方MySQL DDL工具均采用触发器的方式进行实现&#xff0c;包括前面percona的pt-osc&#xff0c;Facebook的OSC等等。而gh-ost采用的机制和他们完全不同&#xff1a;它通过MySQL binlog来同步数据。 gh-ost会伪装…

PowerToys 微软效率工具包 使用指南

PowerToys 微软效率工具包 使用教程 Microsoft PowerToys 是一组实用程序&#xff0c;供高级用户调整和简化其 Windows 10 和 11 体验以提高工作效率。 下载 PowerToys⇲ 安装教程 1.双击文件运行 点击我同意 2.等待下载安装完成 3.安装完成 使用指南 Always on Top 通…

FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D)

本教程将在Unity3D中混合Optitrack与数据手套的数据流&#xff0c;在人体运动的基础上&#xff0c;添加双手手指部分的运动。 双手手背的角度仍由Optitrack提供&#xff0c;数据手套提供双手手指的角度。 01 客户端软件 分别安装MotiveBody与MotionVenus并校准人体与数据…

Kafka-Topic创建源码分析

Kafka-Topic创建源码分析 在kafka中,创建topic通过使用kafka-topics.sh脚本或者直接调用AdminClient对外提供的adminApi来进行创建. 即使是使用kafka-topics.sh&#xff0c;其最终会通过生成并调用AdminClient来进行处理. 0,创建topic流程图 1,创建topic示例代码 通过引入A…

工作两年半,终于学会了Jenkins部署Maven项目

上期我们讲了Linux部署Jenkins Linux安装Jenkins&#xff08;Java11最新版&#xff09; 这期我们来讲的是使用Jenkins部署一个maven项目 文章目录&#x1f46e;所需要的环境&#xff08;必须要有&#xff0c;否则不能进行下一步&#xff09;&#x1f64b;第一步&#xff0c;安装…

02 运算符

目录 第一章&#xff1a;概述 第二章&#xff1a;算术运算符 2.1 概述 2.2 应用示例 2.3 号的两种用法 2.4 自增自减运算 2.4.1 概述 2.4.2 单独使用 2.4.3 复合使用 第三章&#xff1a;赋值运算符 3.1 概述 3.2 应用示例 第四章&#xff1a;关系运算符&#xff0…

vue3.0找不到模块“./App.vue”或其相应的类型声明

vue3报错提示 找不到模块“/App.vue”或其相应的类型声明 情况一、vue3.0js 报错原因&#xff1a;javascript只能理解.js文件&#xff0c;无法理解.vue文件。 解决方案&#xff1a;根目录新建jsconfig.json {"compilerOptions": {"baseUrl": "./&qu…

被取消的AP考试到底是什么嘞?

最近&#xff0c;好多考试都延期或取消了&#xff0c;美国大学理事会&#xff08;College Board&#xff09;也发布公告&#xff0c;宣布受疫情影响&#xff0c;上海、北京等地的AP考试正式取消&#xff0c;不提供线上考试的机会&#xff0c;而且不会安排后续补考。 这条消息惊…