sizeof和&取地址

我们知道通过sizeof可以求得一个变量的大小,通过&符号可以取一个变量的地址,那当它们对一个变量或者数组操作时又有何不同呢?

1. sizeof

   首先,sizeof不是函数,而是一个表达式,可以求变量或者类型所占空间的大小.

    1).变量
      sizeof求变量的大小时可以不加(),如:sizeof a;但是求类型必须加(),sizeof(int) 。
    对一个int类型的变量大小为多少呢?通过sizeof我们可以看出:

     int s = 9;
     printf("%d\n",s);


     结果为:4
    2). 数组
    sizeof也可以求一个数组的大小,当sizeof(数组名)时,数组名表示整个数组,表达式求的是整个数组的大小,单位是字节。

例如: 

int arr[4] = {1,2,3,4};
printf("%d\n,sizeof(arr));

这个数组的大小是:4 * 4 = 16


  2. &取地址 

   &取地址,表示取某一个变量的地址。
   1).变量

  可以将一个变量的地址以不同的形式打印出来。

 int a = 10;
 printf("%p\n",&a);//将a的地址以满地址的形式打印出来
 printf("%x\n",&a);//将a的地址以十六进制形式打印出来


   2). 数组
 同样的,&也可以作用于数组:

例如:

    int arr[10] = {0};
    printf("%p\n",&arr);//表示整个数组的地址,数组名表示整个数组
    printf("%p\n",&arr + 1);// +1表示跳过整个数组
    printf("%p\n",arr);//表示数组首元素的地址
    printf("%p\n",arr + 1);//+1表示跳过数组中的一个元素

结果:

注意:sizeof(数组名),数组名表示整个数组,表达式求的是整个数组的大小,单位是字节;&数组名,数组名表示整个数组,表示求的是上述整个数组的地址,除过上述两种情况,他所有的数组名都是首元素的地址。

来看下面这个例子,我的编译器是32位的。

  int a[] = {1,2,3,4};
   printf("%d\n",sizeof(a));//数组名,表示整个数组的大小        16
   printf("%d\n",sizeof(a+0));//表示第一个元素的地址           8
   printf("%d\n",sizeof(*a));//代表第一个元素                  4
   printf("%d\n",sizeof(a+1));//代表第二个元素的地址           8
   printf("%d\n",sizeof(a[1]));//代表第二个元素                4
   printf("%d\n",sizeof(&a));//表示整个数组的地址              8
   printf("%d\n",sizeof(&a+1));//第一个元素的第二个字节的地址   8
   printf("%d\n",sizeof(&a[0]));//表示是第一个元素的地址        8
   printf("%d\n",sizeof(&a[0]+1));//第一个元素第二个字节的地址  8

猜你喜欢

转载自blog.csdn.net/y6_xiamo/article/details/81318267