• C语言 对数组名取地址


    作者 : 卿笃军


    你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算。这会出现什么样的结果呢?

    演示样例:

    int a[5] = {1,2,3,4,5};

    int *p = (int *)(&a+1);

    printf("%d ",*(p-1));


    这个输出会是多少呢?

    咦?为什么第二行须要强制转化类型呢?

    答:a是一个一维数组的名字,&a相当于一个指向一维数组的指针。怎么感觉这么熟悉?指向数组的指针,那不就是行指针吗?int (*p)[]。

    行指针+1,就是对指针进行加减操作,其结果还是一个行指针~~~原来如此,须要强制转换为单指针。

    能够看一段代码,例如以下:

    #include <stdio.h>
    
    int main()
    {
    	int a[5] = {1,2,3,4,5};
    	int *p = (&a+1);   
    
    	return 0;
    }
    编译会出现例如以下警告(警告行数:int *p = (&a+1);):


    上面的警告也告诉我们,&a是一个行指针~~~


    那么,输出结果是多少呢?

    答:当然是5。

    为什么?

    答:上面不是说了嘛,&a就是一个行指针,那就是指向一行的指针咯。行指针+1,不就指向下一行了,这里一行为[5]个,那么int *p = (int *)(&a+1)就要在a的基础上偏离5个位置:(例如以下:上一行表示偏离位数,下一行表示a[]中相应的数据)

    0  1  2  3  4  5  

    1  2  3  4  5  *

    咦,这不是越界了吗?移动五位都跑出a[]数组处于' * '号位置了。哦,我看到printf()输出了。你输出的是*(p-1),这里p是一个单指针-1就是往左位移一位即可了,那不就是又回到5的位置了吗?原来是这样,输出结果是5 。


    以下我们用一段代码来显示位移情况~~~

    #include <stdio.h>
    
    int main()
    {
    	int a[5] = {1,2,3,4,5};
    	int *p = (int *)(&a+1);   //+1相当于移动了5位
    
    	printf("%p
    %p
    bit = %d
    ",a,p,p-a);
    	printf("%d
    ", *(p-1));
    
    	return 0;
    }


  • 相关阅读:
    MySQL 数据库常用命令
    HTML常用标签介绍
    浏览器 返回状态码汇总
    Mysql常用的三种数据库引擎比较
    系统常用端口大全
    nginx入门与实战
    Linux系统基础优化及常用命令
    python开发之virtualenv与virtualenvwrapper讲解
    常用服务安装部署
    远程连接Linux
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3878648.html
Copyright © 2020-2023  润新知