想摸妹妹大腚 发表于 2020-8-11 11:13:55

关于多级指针变量的比较大小

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 就又不会打印了 这是为什么呢?

Cool_Breeze 发表于 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两个类型相同的指针相加毫无意义。

想摸妹妹大腚 发表于 2020-8-11 14:55:50

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

这个是判断他两相等啊不是相加

xieglt 发表于 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 = 255;
        c = 255;
        c = 255;
        c = 255;

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

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

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

Cool_Breeze 发表于 2020-8-11 15:53:40

本帖最后由 Cool_Breeze 于 2020-8-11 16:14 编辑

想摸妹妹大腚 发表于 2020-8-11 14:55
这个是判断他两相等啊不是相加

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

指针指向的地址本来就是一个正整数,当你解引用就会报错或者出现不可预料的后果,你复制的数字指向的地址不确定!
你这样做毫无意义!

Cool_Breeze 发表于 2020-8-11 16:27:58

微软c#说指针不安全!visual studio编译器
那是程序员不安全,不是指针不安全

想摸妹妹大腚 发表于 2020-8-11 20:57:49

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

牛逼 厉害厉害明白了 和答案差不多你这个哈哈

想摸妹妹大腚 发表于 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*****) 类型元素的个数
反汇编证明
页: [1]
查看完整版本: 关于多级指针变量的比较大小