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;
}

猜你喜欢

转载自blog.csdn.net/gsp1004/article/details/126178095