鱼C论坛

 找回密码
 立即注册
查看: 1047|回复: 7

[已解决]关于多级指针变量的比较大小

[复制链接]
发表于 2020-8-11 11:13:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
char* p1;
       
        char* p2;
       
        p1=(char*)3;
       
        p2=(char*)8;
       
        if (p2-p1==0)
               
        {
               
                printf("你理解指针吗? \n");//是否执行?
               
                p1=0;
               
        }
这样的话 肯定不会打印,但是下面这种情况
char** p1;
       
        char** p2;
       
        p1=(char**)5;
       
        p2=(char**)8;
       
        if (p2-p1==0)
               
        {
               
                printf("你理解指针吗? \n");//是否执行?
               
                p1=0;
               
        }
就打印了 p1 = 4 就又不会打印了 这是为什么呢?
最佳答案
2020-8-11 15:27:50
本帖最后由 xieglt 于 2020-8-11 15:32 编辑

编译器通常会优化你的代码,有一种优化叫内存对齐,内存对齐跟你定义的是几级指针无关。
跟CPU和操作系统有关,32位操作系统内存对齐总是在4的整数倍。
这样,内存的访问速度更快。
比如说你定义一个 char c;在程序里它只有一个字节,而实际上,编译器会为它分配4个字节的空间,
以达到内存对齐的效果。
win32系统里,不管你定义几级指针,都是用4个字节来存储它。

你的代码里,强制把8赋值给p2,把5赋值给p1,
再把它们相减,因为你定义的是指针变量,编译器认为他们是用来访问内存的,因此编译器在优化代码的时候会把这个结果与4对齐
也就是(p2 - p1)/4,如果p2-p1小于4,除以4后则为0,如果大于4,除以4后则不为0

参考一下以下代码,理解一下:
int main(void)
{
        int b;
        char a;
        char *c = &a;
        int d;
        
        b = 1000;
        //变量是char型,实际上分配了4个字节,改变它相邻4个字节的值不会影响别的变量
        c[0] = 255;
        c[1] = 255;
        c[2] = 255;
        c[3] = 255;

        d = b;
        printf("d=%d\n",d);

        //继续改变4个字节之后的内容,将影响变量的b内容。
        c[4] = 255;
        c[5] = 255;
        c[6] = 255;
        c[7] = 255;

        d = b;
        printf("d=%d\n",d);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 11:31:37 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-11 11:33 编辑

比如p1和p2都是类型为int的指针,虽然他们指向的内存中保存了两个int数N1和N2,但是这两个数在内存中可能挨着,也可以能间隔很远,甚至有可能是一个地方。假设p1值也就是N1位置起始值为1234,P2为2345,这个时候如果直接相加得到的数据3589有可能已经超出了内存为什么两个指针相加没有意义最大值或者指向某个无意义的内存地址,所以指针相加没有意义可言。正确的应该是N1和N2相加才是合理的算数运算。
https://zhidao.baidu.com/question/628881705614138004.html两个类型相同的指针相加毫无意义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 14:55:50 | 显示全部楼层
Cool_Breeze 发表于 2020-8-11 11:31
比如p1和p2都是类型为int的指针,虽然他们指向的内存中保存了两个int数N1和N2,但是这两个数在内存中可能挨 ...

这个是判断他两相等啊不是相加
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:27:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-8-11 15:32 编辑

编译器通常会优化你的代码,有一种优化叫内存对齐,内存对齐跟你定义的是几级指针无关。
跟CPU和操作系统有关,32位操作系统内存对齐总是在4的整数倍。
这样,内存的访问速度更快。
比如说你定义一个 char c;在程序里它只有一个字节,而实际上,编译器会为它分配4个字节的空间,
以达到内存对齐的效果。
win32系统里,不管你定义几级指针,都是用4个字节来存储它。

你的代码里,强制把8赋值给p2,把5赋值给p1,
再把它们相减,因为你定义的是指针变量,编译器认为他们是用来访问内存的,因此编译器在优化代码的时候会把这个结果与4对齐
也就是(p2 - p1)/4,如果p2-p1小于4,除以4后则为0,如果大于4,除以4后则不为0

参考一下以下代码,理解一下:
int main(void)
{
        int b;
        char a;
        char *c = &a;
        int d;
        
        b = 1000;
        //变量是char型,实际上分配了4个字节,改变它相邻4个字节的值不会影响别的变量
        c[0] = 255;
        c[1] = 255;
        c[2] = 255;
        c[3] = 255;

        d = b;
        printf("d=%d\n",d);

        //继续改变4个字节之后的内容,将影响变量的b内容。
        c[4] = 255;
        c[5] = 255;
        c[6] = 255;
        c[7] = 255;

        d = b;
        printf("d=%d\n",d);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:53:40 | 显示全部楼层
本帖最后由 Cool_Breeze 于 2020-8-11 16:14 编辑
想摸妹妹大腚 发表于 2020-8-11 14:55
这个是判断他两相等啊不是相加


指针变量内存地址相等吗?
还是指针指向的值相等呢?
还是指针自身大小相等?

指针指向的地址本来就是一个正整数,当你解引用就会报错或者出现不可预料的后果,你复制的数字指向的地址不确定!
你这样做毫无意义!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 16:27:58 | 显示全部楼层
微软c#说指针不安全!visual studio编译器
那是程序员不安全,不是指针不安全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-11 20:57:49 | 显示全部楼层
xieglt 发表于 2020-8-11 15:27
编译器通常会优化你的代码,有一种优化叫内存对齐,内存对齐跟你定义的是几级指针无关。
跟CPU和操作系 ...

牛逼 厉害厉害明白了 和答案差不多你这个哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 21:10:11 | 显示全部楼层
xieglt 发表于 2020-8-11 15:27
编译器通常会优化你的代码,有一种优化叫内存对齐,内存对齐跟你定义的是几级指针无关。
跟CPU和操作系 ...

更准确的应该是这样 最后debug下
p2 - p1 的值 为  (p2 - p1) /4  = (5  -3) /4 = 0;(整除)
也就是说p2 与 p1 相减 必然类型相同 ,所表达的意思是 他们之间 相差 (去掉一个*) 这种(char*****) 类型元素的个数
反汇编证明
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表