我们知道通过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