C语言对于数组的理解

// 64位机上测试,后面的注释就是输出结果和解释
#include <stdio.h>
#include<typeinfo>  // typeid(a).name() C++的库,打印出数据类型
#define print_hex(a) printf(#a"\t%#x\n", (a) )
#define print_type(a) printf(#a" type is \t%s\n", typeid(a).name() )

int main()
{
    int a[8];
	int *p = a;                                                       
    print_hex(a);     // a       0xf140a310
    print_hex(a+1);   // a+1     0xf140a314
    print_hex(&a);    // &a      0xf140a310
    print_hex(&a+1);  // &a+1    0xf140a330  ->因为&a的类型是[指向(有8个int数据的数组)的指针],\
    				  所以+1递增了sizeof(int (*)[8]) = sizeof(int)*8 = 32 = 0x20
    print_type(a );   // a type is       A8_i  ->有8个int数据的数组
    print_type(&a);   // &a type is      PA8_i ->指向(有8个int数据的数组)的指针
    print_hex(p);     // p       0xf140a310
    print_hex(p+1);   // p+1     0xf140a314
    print_hex(&p);    // &p      0xf140a308  ->这里倒是可以看出栈是从高地址(a的地址0xf140a310)往低地址生长
    print_hex(&p+1);  // &p+1    0xf140a310  ->&p=0xf140a308,类型PPi,\
    				  所以&p+1=0xf140a308+1*(sizeof(int **)),和a的地址没有半毛钱关系,只是巧合
    print_type(p );   // p type is       Pi
    print_type(&p);   // &p type is      PPi
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值