【指针进阶】(题目练习)

news2024/11/25 15:25:56

这篇文章的思维导图在这里:思维导图

在这里插入图片描述

一维数组:

int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
#include<stdio.h>

int main() {
	//数组名的理解
	//数组名是数组首元素的地址
	//但是有2个例外:
	//1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
	//2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址

	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	//4*4 = 16	
	printf("%d\n", sizeof(a + 0));
	//4/8 数组首元素的地址
	printf("%d\n", sizeof(*a));
	//4 数组的首元素
	printf("%d\n", sizeof(a + 1));
	//4/8 数组第二个元素的地址
	printf("%d\n", sizeof(a[1]));
	//4 第二个元素
	printf("%d\n", sizeof(&a));
	//4/8 数组的地址
	printf("%d\n", sizeof(*&a));
	//16
	printf("%d\n", sizeof(&a + 1));
	//4/8 &a相对于&a是跳过了整个数组 但是还是地址
	printf("%d\n", sizeof(&a[0]));
	//4/8 数组首元素的地址
	printf("%d\n", sizeof(&a[0] + 1));
	//4/8 数组第二个元素的地址
	return 0;
}

字符数组

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
#include<stdio.h>

int main() {
	
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));
	//arr表示整个数组 计算的是整个数组的大小 单位是字节 6个字节
	printf("%d\n", sizeof(arr + 0));
	//arr表示数组首元素的地址 4/8个字节
	printf("%d\n", sizeof(*arr));
	//arr表示数组的首元素的地址,*arr就是首元素 1个字节
	printf("%d\n", sizeof(arr[1]));
	//arr[1]是第二个元素 大小是1个字节
	printf("%d\n", sizeof(&arr));
	//&arr是数组的地址 4/8个字节
	printf("%d\n", sizeof(&arr + 1));
	//&arr+1表示跳过整个数组之后的地址,是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));
	//表示第二个元素的地址 是4/8个字节
	return 0;
}
char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", strlen(arr));
	//随机值
	printf("%d\n", strlen(arr + 0));
	//随机值
	//printf("%d\n", strlen(*arr));
	//error 因为strlen函数需要传入一个地址
	//这里传入的是值“a”,因为a为97,所以将97作为地址去访问
	//非法访问内存
	//printf("%d\n", strlen(arr[1]));
	//同上
	printf("%d\n", strlen(&arr));
	//是数组的地址 随机值
	printf("%d\n", strlen(&arr + 1));
	//随机值
	printf("%d\n", strlen(&arr[0] + 1));
	//随机值
#include<stdio.h>

int main() {
	char arr[] = "abcdef"; // abcdef\0
	printf("%d\n", sizeof(arr));
	//7
	printf("%d\n", sizeof(arr + 0));
	//4/8
	printf("%d\n", sizeof(*arr));
	//1
	printf("%d\n", sizeof(arr[1]));
	//1
	printf("%d\n", sizeof(&arr));
	//4/8
	printf("%d\n", sizeof(&arr + 1));
	//4/8
	printf("%d\n", sizeof(&arr[0] + 1));
	//4/8
	return 0;
}
#include<stdio.h>

int main()
{
	char* p = "abcdef";
	//         012345
	
	printf("%d\n", strlen(p));//6
	printf("%d\n", strlen(p + 1));//5
	//printf("%d\n", strlen(*p));//err
	//printf("%d\n", strlen(p[0]));//err
	printf("%d\n", strlen(&p));//随机值
	printf("%d\n", strlen(&p + 1));//随机值
	printf("%d\n", strlen(&p[0] + 1));//5

	//printf("%d\n", sizeof(p));//p是一个指针变量
	大小就是4/8

	//printf("%d\n", sizeof(p + 1));//p+1是'b'的地址,是地址大小就是4/8个字节
	//
	//printf("%d\n", sizeof(*p));//*p 就是'a',就是1个字节
	//printf("%d\n", sizeof(p[0]));//p[0]--> *(p+0) --> *p  1个字节

	//printf("%d\n", sizeof(&p));//4/8
	&p -- char**
	//printf("%d\n", sizeof(&p + 1));//
	4/8
	//printf("%d\n", sizeof(&p[0] + 1));//4/8 , &p[0] + 1得到是'b'的地址 

	return 0;
}

二维数组

#include<stdio.h>
int main()
{
	int a[3][4] = { 0 };

	printf("%d\n", sizeof(a));//3*4*4 = 48
	printf("%d\n", sizeof(a[0][0]));//4

	printf("%d\n", sizeof(a[0]));//a[0]是第一行这个一维数组的数组名
	//数组名算是单独放在sizeof内部了,计算的是整个数组的大小,大小是16个字节

	printf("%d\n", sizeof(a[0] + 1));//?
	//a[0]作为第一行的数组名,没有单独放在sizeo内部,没有&
	//a[0]表示数组首元素的地址,也就是a[0][0]的地址
	//所以a[0]+1是第一行第二个元素的地址,是地址就是4/8个字节
	//
	printf("%d\n", sizeof(*(a[0] + 1)));//4
	//计算的是就是第一行第2个元素的大小

	printf("%d\n", sizeof(a + 1));//4 / 8
	//a是数组首元素的地址,是第一行的地址 int(*)[4]
	//a+1 就是第二行的地址

	printf("%d\n", sizeof(*(a + 1)));//16
	//*(a+1) --> a[1] -> sizeof(*(a+1))->sizeof(a[1]) 计算的是第二行的大小
	//a+1 --> 是第二行的地址,int(*)[4]
	//*(a+1) 访问的第二行的数组

	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]是第一行的地址 int(*)[4]
	//&a[0]+1 是第二行的地址 int(*)[4]

	printf("%d\n", sizeof(*(&a[0] + 1)));//16 计算的是第二行的大小

	printf("%d\n", sizeof(*a));//计算的是第一行的大小-16
	//a是数组首元素的地址,就是第一行的地址
	//*a 就是第一行
	//*a --> *(a+0) --> a[0]

	printf("%d\n", sizeof(a[3]));//16
	//a[3]--> int [4]
	//
	return 0;
}

题目练习:

#include<stdio.h>
int main()
{
	int a[5] = { 1, 2, 3, 4, 5 };

	int* ptr = (int*)(&a + 1);

	printf("%d,%d", *(a + 1), *(ptr - 1));
	//2,5
	return 0;
}
#include<stdio.h>
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}* p = (struct Test*)0x100000;

//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);//+20
	printf("%p\n", (unsigned long)p + 0x1);//+1
	printf("%p\n", (unsigned int*)p + 0x1);//+4
	return 0;
}
#include<stdio.h>
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);
	//4,2000000
	return 0;
}
#include <stdio.h>
int main()
{
	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
	//逗号表达式
	//1 3 5
	//1 3
	//5 0
	//0 0
	int* p;
	p = a[0];
	printf("%d", p[0]);
	//1
	return 0;
}
#include <stdio.h>
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]);//-4
	//10000000000000000000000000000100
	//11111111111111111111111111111011
	//1111 1111 1111 1111 1111 1111 1111 1100
	//F    F    F    F    F    F    F    C
	//0xFFFFFFFC

	return 0;
}
#include <stdio.h>
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));
	//10,5
	return 0;
}
#include <stdio.h>
int main()
{
	char* a[] = { "work","at","alibaba" };

	char** pa = a;
	
	pa++;
	
	printf("%s\n", *pa);
	//at
	return 0;
}
#include<stdio.h>
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);
	//POINT
	//ER
	//ST
	//EW

	return 0;
}

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

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

相关文章

Vit 实战营 Class2:图像与Transformer基础

文章目录 数组图像&#xff1a;图像与像素图像分类&#xff1a;机器如何学习&#xff1f;NMT&#xff1a;Neuron Machine TranslationTransformerVision Transformer代码实战 数组图像&#xff1a;图像与像素 什么是数字图像&#xff1f;在计算机图像的图像格式。每一个点叫pix…

全国节能宣传周丨物通博联智慧能源解决方案助力节能降碳

今年7月10日至16日&#xff0c;为全国第33个节能宣传周。今年全国节能宣传周活动主题是“节能降碳&#xff0c;你我同行”。 全国节能宣传周活动是在1990年国务院第六次节能办公会议上确定的活动周&#xff0c;开展该活动是实施全面节约战略、开展节能降碳宣传教育、推动形成绿…

ros系统生成kinova双臂机器人moveit配置包方法,详细过程,亲测有效!

环境&#xff1a;ubuntu18.04 ros&#xff1a;melodic 此博客前提你已经安装了moveit&#xff0c;如果未安装&#xff0c;可参考链接 一、启动MoveIt Setup Assistant roslaunch moveit_setup_assistant setup_assistant.launch点击&#xff1a;Create New MoveIt Configurat…

听产品大佬谈大语言模型的商业化价值

今年 3 月以来&#xff0c;全球各大厂商陆续发布大语言模型&#xff0c;无数人欢欣鼓舞&#xff0c;庆祝沉寂了几年的 AI 领域重新焕发生机。 然而热闹过后&#xff0c;一个现实的问题摆在面前&#xff1a;大语言模型的商业化价值该如何挖掘&#xff1f; 来自美洽的资深产品经…

CVE-2021-41773

CVE-2021-41773 Apache Httpd Server 路径穿越漏洞 Httpd&#xff08;即 HTTP Daemon &#xff0c;超文本传输协议守护程序的简称&#xff09;是一款运行于网页服务器后台&#xff0c;等待传入服务器请求的软件。HTTP 守护程序能自动回应服务器请求&#xff0c;并使用 HTTP 协…

fastadmin调试前端js

当键盘按键抬起后打印id #username&#xff0c;点击箭头的除缓存 隐藏前端昵称 设置为 style"sidplay:none" 添加管理员组别的时候把此处的 NULL改为 1 就可以默认选择第一组别

springboot生鲜交易系统

生鲜交易管理方面的任务繁琐,以至于交易市场每年都在生鲜交易管理这方面投入较多的精力却效果甚微,生鲜交易系统的目标就是为了能够缓解生鲜交易管理工作方面面临的压力,让生鲜交易管理方面的工作变得更加高效准确。 本项目在开发和设计过程中涉及到原理和技术有: B/S、java技…

css 绘制直角梯形 和 平行四边形

<div:class"{isFirst: index 0,tab_item: index ! 0,}":style"{width: item?.label?.length > 4 ? 206px : 137px,}"><div>{{ item.label }}</div></div> isFirst是直角梯形 tab_item是平行四边形 直角梯形 .isFirstcur…

计算机系统结构与操作系统实验三(5)-中断

&#x1f4cd;实验要求 将中断处理程序放到C里编写 &#x1f4cd;实验过程 鉴于代码相比之前&#xff0c;多出了很多配套的固定代码&#xff0c;因此代码量和代码中来突增&#xff0c;本文就不再一个一个贴代码了&#xff0c;需要的直接去看我上传在csdn的代码吧(文末有链接…

音视频绕不开的话题之WebRTC

什么是WebRTC&#xff1f; 闲来无事&#xff0c;我们今天探讨下音视频绕不开的一个话题&#xff1a;WebRTC。WebRTC之于音视频行业&#xff0c;无异于FFMpeg&#xff0c;可以说WebRTC的开源&#xff0c;让音视频行业大跨步进入发展快车道。 WebRTC是一个支持实时音视频通信的开…

mac系统终端运行python文件

1.在要运行的python文件首行里添加python解释器路径代码 代码&#xff1a; #!/usr/bin/env python3 注意:上面代码中的python3是对应当前的python版本 例子&#xff1a; 2.复制要运行的python文件位置&#xff0c;在终端使用代码进入要运行的文件位置 终端运行代码&…

架构训练营3:架构设计流程和架构师职责

架构师相关职责&#xff1a; 架构师是业务和技术之间的桥梁&#xff0c;架构师不能只顾技术&#xff0c;不懂业务&#xff0c;架构师很容易两头不讨好 三个核心能力&#xff1a; 判断&#xff1a;1业务理解力2.技术能力3.沟通能力 拆解&#xff1a;1技术深度2.技术宽度3.技术…

出差在外,远程访问企业局域网象过河ERP系统【内网穿透】

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻&#xff0c;不管是财务、生产、销售还是采购&#xff0c;都需要用到ERP系统来协助。…

抖音seo软件技术开发源码搭建部署

抖音SEO矩阵系统源码开发流程分为以下几个步骤&#xff1a; 1.需求分析 在开发抖音SEO矩阵系统源码之前&#xff0c;首先需要对用户的需求进行分析&#xff0c;确定开发的功能和特性。 2.架构设计 根据需求分析的结果&#xff0c;进行架构设计&#xff0c;确定系统的整体框…

模型压缩-裁剪、量化、蒸馏

模型压缩是一种缩小神经网络结构和参数的技术。 压缩的模型在使用少量计算资源 的情况下&#xff0c;使其性能与原始模型近似&#xff1b;常见包括剪枝、量化、蒸馏、神经结构搜索(NAS)等 ##模型压缩与工程部署关注的常用参数1&#xff09;模型大小 一般使用参数量parameter来衡…

Acwing算法基础 前缀和 差分 双指针 位运算 离散化

前缀和与差分 AcWing 795. 前缀和 import java.util.*; public class Main{public static void main(String[] args ){Scanner scnew Scanner(System.in);int nsc.nextInt();int msc.nextInt();int[] arrnew int[n1];arr[0]0;for(int i1;i<n;i) {arr[i]sc.nextInt()arr[i-1…

【从零开始学CSS | 第二篇】伪类选择器

目录 前言&#xff1a; 伪类选择器&#xff1a; 常见的伪类选择器&#xff1a; 举例&#xff1a; 小窍门&#xff1a; 总结: 前言&#xff1a; 上一篇文章我们详细的为大家介绍了一些常见的选择器&#xff0c;这几篇我们将再次介绍CSS中的一个常见选择器——伪类选择器&am…

flutter开发实战-css的linear-gradient的值转换成LinearGradient

flutter开发实战-css的linear-gradient的值转换成LinearGradient 在开发中遇到了参照前端的css的属性值&#xff0c;需要将css的linear-gradient值转换成LinearGradient&#xff0c;这样可以直接设置相应的值。这里暂时不涉及到&#xff0c;颜色值名称、color-stop1&#xff0…

第6章 NVMe 介绍 6.1-6.3

6.1 AHCI 到 NVMe AHCI协议。NVMe协议。 HDD 和早期的 SSD 绝大多数都是使用SATA接口&#xff0c;跑的是AHCI&#xff0c;它是一种系统接口标准。 后来&#xff0c;AHCI 和 SATA 不能满足高性能和低时延 SSD 的需求&#xff0c;SSD 需要更快、更高效的协议和接口。因此 NVMe 出…

webug4.0靶场通关笔记

文章目录 注入显错注入布尔注入延时注入post注入过滤注入宽字节注入xxe注入csv注入万能密码登陆 XSS反射型xss存储型xssDOM型xss过滤xss链接注入 任意文件下载任意文件下载mysql配置文件下载 上传漏洞文件上传(前端拦截)文件上传(解析漏洞)文件上传(畸形文件)文件上传(截断上传…