C语言中的“小幽默”

    技术2022-05-20  33

     

    #include <stdio.h>

    int main( )

            {

                    int *p=NULL;

                    printf( "sizeof( int )=%d/n",sizeof( int ) );

                    printf( "int *p=NULL/n sizeof( p )=%d/n",sizeof( p ) );

                    printf( "sizeof( *p )=%d/n",sizeof( *p ) );

                    int a[ 100 ];

                    printf( "int a[ 100 ]/n sizeof( a )=%d/n",sizeof( a ) );

                    printf( "sizeof(a[ 100 ])=%d/n",sizeof( a[ 100 ] ) );

                    printf( "sizeof( &a )=%d/n",sizeof( &a ) );

                    printf( "sizeof( &a[ 0 ]=%d)/n",sizeof( &a[ 0 ] ) );

                    return 0;

     

            }

    结果:

    sizeof( int )=4

    int *p=NULL

     sizeof( p )=8

    sizeof( *p )=4

    int a[ 100 ]

     sizeof( a )=400

    sizeof(a[ 100 ])=4

    sizeof( &a )=8

    sizeof( &a[ 0 ])=8

    这里说明一下我用的是64bit的系统,所以有 sizeof( p )=8;

    p是一个指针变量,其内容是一个地址,然后*p意为取这个地址的内容。

    a是代表整个数组,&a是取a的地址也就是一个指针,所以为8;

    注意a[1],a[2]...等等a[i]在内存中是不存在的,也就是不占用内存空间,它们只是数组int a[100]的元素(标记);

    为什么会有sizeof(a[ 100 ])=4???a[100]不是越界了吗?要注意sizeof()是运算符,会在编译时期根据数据的类型求出结果,并没有去访问内存空间,

    可以说有越界的嫌疑,但是在编译阶段却是清白的。

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

     

    在C++中 const 修饰的只读变量可以作为case后面的数据:

    #include <iostream>

    using namespace std;

     

    int  main()

    {

    cout<<"this is a test/n";

    const int a=1;

    int num=0;

    for(;num<3;num++)

    switch(num)

    {

    case 0:

    cout<<"0/t";break;

    case a:

    cout<<"a/t"<<a;break;

    default:

    break;

    }

     

    return 0;

    }

    结果:

    this is a test

    0 a 1

     

    但是在C语言里面不允许!!!

     

    !!!!!

    这是一条很有矛盾的语句,但是在某写情况下却也成立~_~

    const volatile int i=10;

    在C/C++里面都是read-only属性,只要不修改i的值就不会出错。

    const告诉编译器i是个只读常量,不可以修改其值;volatile告诉编译器每次使用i的时候都要去内存中取值,因为i可能会被改变;

    const和volatile的矛盾中const占了上风~

     

    !!!!!!!!!!!

    #include <stdio.h>

    union

    {

    int i;

    char a[2];

    }*p,a;

     

    int main( )

            {

                    p=&a;

                    p->a[0]=0x39;

                    p->a[1]=0x38;

                    printf("%d",p->i);

                    return 0;

     

            }

    结果是:

    3839

    要知道,在计算机内部采用的存储模式是:小端模式;而在网络中采用的是大端模式。

    因为,局部变量的分配是在栈里面进行,是从高地址--->低地址,并且采用小端模式,所以可知结果为:3839

    另外union的所有成员起始地址一样!

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


    最新回复(0)