讨论C语言数组名

void main(){
    
    //C语言的所有指针变量的sizeof值只与编译器有关,当编译器编译为32位程序时其值为“4”,而编译为64位程序时其值为“8”。
    //一个指针变量自加“1”,所增加的字节是该指针所指向的内存区域的大小。
    
    int num[]={1,2,3,4};
    int (*p)[4];

    printf("%d, %d\n", num, &num);
    //6356728 6356728
    //注意:虽然num和&num的值一样,但是所代表的意义各不相同。num表示该数组第一个元素的地址,而&num表示整个该数组在内存中起始的地址,而这个起始地址恰好又是该数组第一个元素的地址,所以两者相等。
    //另外:数组名num仅仅是一个标识符,它的值在内存分配结束之后被确定,并且以后无法被改变(除非该内存区域被释放),类似于一个只读的指针。
    
    printf("%d, %d\n", num, num+1);
    //6356728 6356732
    //解释:num指向的是该数组第一个元素的地址,这时你可以把它狭义地理解为一个常量指针(伪代码:const int *p),并且其指向的内存区域的大小为4,于是num+1便移动4个字节。
    
    printf("%d, %d\n", &num, &num+1);
    //6356728 6356744
    printf("%d, %d\n", sizeof(num), sizeof(&num));
    //20 4
    p = #
    //能成功赋值,注意:p = num会提示赋值类型不符的警告。
    /*
    解释:
        &num指向的是整个该数组在内存中起始的地址,即一片连续内存区域的起始地址(当有一个标识符标识的是一片连续的内存区域时,此时,不加&符号,指向的是该区域第一个元素的首地址,而加上&符号,指向的是该区域起始的地址)。
        所以,&num这个标识符(只读的指针)指向的内存区域大小为4*4=16,于是&num+1会移动16个字节。
        特别地,当数组名用sizeof计算时,结果是整片区域的大小,即使数组名本身也应该是个只读的指针。
        
        结论:
        num的类型是  int*
        &num的类型是 int*[N]
    */
}

猜你喜欢

转载自www.cnblogs.com/ryzz/p/9247628.html
今日推荐