【C语言】——指针

指针是用来存放变量地址的地方。

计算机可以通过变量地址,对该地址内部存储的数据进行读写。

int main(int argc, char **argv) {
    // 声明 int 类型的变量
    int a=10;
    
    // 声明 int 类型的指针
    int *p=&a;
    
    //打印出指针所指向变量中的值
    printf("*p=%d\n",*p);
    
    //该打印无意义,错误使用方式
    printf("p=%d\n",p);
    
    //打印出指针地址变量(int)强制转换后的值
    printf("p=0x%x\n",(int)p);
    
    //打印出指针地址
    printf("p=%p",p);
    
    return 0;
}

【运行结果】:

 

 

 

 

 

 

 

问题延伸:

虽然有一些操作是可以通过对地址类型数据强制转换后进行一些读写操作,例如下面:

运行结果:1 // 声明 int 类型的变量
2     int a = 10;
3 
4     int path = (int)&a;
5 
6     int *t = (int*)path;
7     
8     printf("t*=%d\n",*t);
9     printf("t=%p\n", t);

【运行结果】:

 

 

 

 

乍一看,好像感觉没有问题。我们来将 ‘path’ 和 ‘&a’ 打印出来看看:

 

 【运行结果】:

 

 

好像看上去没有什么问题,实际地址和转换后的地址值完全相同。 这是因为我现在用的是32位的编译器

 

我们换64位的编译器对同样的代码运行一下看看:

 【运行结果】:

 

 

可以看到现在地址转换后的值和地址值完全不同。那么我们像刚才上面对转换后的地址值重新转换回指针类型一样操作一下试试看:

 

 

 

果不其然,报错了。这是因为32位和64位编译器对系统数据类型地址大小的分配是有差异的,在编译器转换的过程中失误的话容易造成精度丢失。

 (获得变量地址的方式只能是通过变量,因为32位和64位编译器对地址的分配是有差异的。)

posted on 2021-11-18 11:43  撞破南墙不回头  阅读(287)  评论(0)    收藏  举报

导航