#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的所有成员起始地址一样!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`