(C语言)指针运算 习题练习1.1

习题一:

cs 复制代码
#include <stdio.h>
struct Test
	{
	    int Num;
	    char* pcName;
	    short sDate;
	    char cha[2];
	    short sBa[4];
	} * p = (struct Test*)0x100000;
	
	int main()
	{
	    printf("%p\n", p + 0x1);

	    printf("%p\n", (unsigned long)p + 0x1);

	    printf("%p\n", (unsigned int*)p + 0x1);

	    return 0;
	}

提示(在计算前要搞懂是什么类型)

答案:

1.p 是一个指向 struct Test 类型的指针。 p + 0x1 表示指针 p 向后移动一个 struct Test 的大小。由于 struct Test 的大小是 20 字节,所以 p + 0x1 实际上是 0x100000 + 20 = 0x100014。

这里就运用到计算机十六进制的运算了。或许有人算成 0x100020

在这里在复习一下

在十六进制中:

  • 每一位的权重是16的幂(从右到左依次是 160,161,162,...160,161,162,...)。
  • 加法规则:当某一位的和超过15时,需要向高位进位。
步骤1:将20转换为十六进制

20的十进制值转换为十六进制是:

Go 复制代码
20 (十进制) = 0x14 (十六进制)
  1. 提一个问题: 这里是不是指针+1 ?

答案:不是 .这里其实相等于 整数+1,也就是 0x100000+1 --> 0x100001

  1. 首先是强制转化为整型指针,所以这里是指针运算 = 指针加1,

也就是,0x100004 (跳过一个unsigned int* 大小为4个字节)

注意:本题与环境有关系

在x86环境下:

地址为8位数,所以要补齐

在x64环境下:

习题二:

注意这里有坑奥,小心啊诸君

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

欧克,不知道各位掉入坑没有?发现坑没有?

如果你的答案是0,那么恭喜你成功入坑。

答案揭晓:是 1

这里{0, 1}, (2, 3), (4, 5) 所用的是小括号(),而不是{ },那么其中所表达意思也截然不同,用(),也就是逗号表达式,那什么是逗号表达式呢?

逗号表达式会计算其所有操作数,但只返回最后一个操作数的结果。因此,(0,1)的结果是1,(2, 3) 的结果是 3(4, 5) 的结果是 5。所以,数组 a 实际上被初始化为:1,3,5,0,0,0.

习题三

假设环境是x86环境,程序输出的结果是啥?

注意:指针-指针的前提是两个指针指向同一个空间

得到的结果的绝对值是两个指针之间的元素个数 ,小地址-大地址会得到负数

提示:可以画出图更易理解

cs 复制代码
#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]);
    
   return 0;
}

答案:FFFFFFFC, -4

不知道有小伙伴答对了嘛

在搞懂了位置和大小后要注意输出的格式 %p %d

  • 第一个参数%p):输出地址差值的指针表示,直接将内存的值,当作地址直接打印
  • −4(十进制)在 x86环境下表示为无符号整数时是 0xfffffffc0xfffffffc(32位系统)。(这里会运用的到原码,反码,补码的概念)
  • 第二个参数%d):输出地址差值的整数值。
    −4.

欧克,今日的习题就到此为止了。下章再见。

如果有什么疑问或错误,欢迎指出!

相关推荐
Aric_Jones2 小时前
lua入门语法,包含安装,注释,变量,循环等
java·开发语言·git·elasticsearch·junit·lua
Akiiiira2 小时前
【日撸 Java 三百行】Day 12(顺序表(二))
java·开发语言
AndrewHZ2 小时前
【图像处理基石】什么是油画感?
图像处理·人工智能·算法·图像压缩·视频处理·超分辨率·去噪算法
.格子衫.2 小时前
015枚举之滑动窗口——算法备赛
数据结构·算法
EndingCoder2 小时前
2025年JavaScript性能优化全攻略
开发语言·javascript·性能优化
Despacito0o3 小时前
QMK键盘固件自定义指南 - 打造你的专属键盘体验
c语言·计算机外设·qmk
J先生x3 小时前
【IP101】图像处理进阶:从直方图均衡化到伽马变换,全面掌握图像增强技术
图像处理·人工智能·学习·算法·计算机视觉
爱coding的橙子5 小时前
每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
算法·leetcode
码上淘金6 小时前
【Python】Python常用控制结构详解:条件判断、遍历与循环控制
开发语言·python
Brilliant Nemo6 小时前
四、SpringMVC实战:构建高效表述层框架
开发语言·python