C指针问题,二级指针是否与这个形式相等?

查看:101
本文介绍了C指针问题,二级指针是否与这个形式相等?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

#include <stdio.h>
int main(void)
{
    int a;
    int *ptr_a,*ptr_ptr_a;
    int **ptr;
    a=0;
    ptr_a = &a;
    ptr_ptr_a = (int*)&ptr_a;
    ptr = &ptr_a;
    //    给A赋值有两种方式:
    **ptr = 1;
    //    或
    *(int*)*ptr_ptr_a = 1;
    printf("%d",a);
    return 0;
}

如上程序,其中

**ptr

*(int*)*ptr_ptr_a

的作用是相等的吗?
想请问一下这样子有什么弊端?(除开语法上写着麻烦,会不会造成bug?)

解决方案

不相等。
从内部储存的角度考虑的话,我觉得是会出bug的。
首先,对于c程序中,内存地址的长度都是一致的,所以用int*int**储存地址是不会出现数据溢出的问题,都是用一个long的大小储存地址的。(其中32位系统大小为4byte,64位系统为8byte)
其次,对于一个指针所指向的内存程序将会根据指针的类型决定从地址起始处开始读几个byte,如果是一个int*的指针那么将会读入一个int的大小即4byte,如果是一个int**那么将会读入一个long的大小(4byte或者8byte),所以如果题主想要用ptr_ptr_a来修改a值的话我们来看一下,第一步解引用*ptr_ptr_a的话,由于ptr_ptr_a是一个int*的指针所以程序从ptr_ptr_a处读入一个int的大小,好了,到这为止对于64位的系统的朋友们就可能会出bug了,因为他们的地址长度是8个byte,有4个byte被截断了,32位的系统应该没事,因为他们的地址大小就是4个byte,所以对于第一步解引用就会可能会出现bug。如果题主还是要折腾的话那应该这样写:

*(int*)*(int**)ptr_ptr_a=1;  

其实这样的话也就和`int**`没差啦?
以及那个**ptr题主写的是没问题的~

这篇关于C指针问题,二级指针是否与这个形式相等?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆