文章目录
由于指针的访问可以通过*和[]实现,以及在不同条件下数组名代表的意义不同,加上对于sizeof、strlen的用法理解不够透彻,初学者在使用的时候容易错误使用指针,并且难以发现错误。本文将结合大量例子,讲解数组名、指针加减整数后指向位置、sizeof和strlen的用法。
关于sizeof
sizeof后的内容不会真的计算,sizeof的结果在编译阶段就已经得出
#include<stdio.h>
int main()
{
char a = 1;
printf("%d\n", a);
int b = sizeof(a);
printf("%d\n", b);
int c = sizeof(a++);//为什么c不是4?//a++并没有真的计算
printf("%d\n", a);
printf("%d\n", c);
int d = sizeof(++a);
printf("%d\n", d);
int e = sizeof(-a);//这里发生了整形提升
printf("%d\n", e);
int i = 1;
short j = 2;
printf("%d\n", sizeof(i = i + j));//4
printf("%d\n", sizeof(j = j + i));//2
return 0;
}
我们知道,赋值表达式的值是赋值之后,被赋值给变量的那个值就是该表达式的值。操作符sizeof求得是变量或类型所占内存空间得大小。
在上面的代码中,a的类型是char,故b得值是1;
表达式a++和++a的实质都是把a+1的值赋值给a,已经完成了赋值操作,a的大小还是1字节,故c和d的值都是1;
需要注意的是,a++和++a这两个表达式并没有真的在程序中计算,sizeof在编译期间就算出了a++和++a的值,故打印出来a的值还是1而不是2;
然而,对于大小小于int的类型,在表达式中会进行整型提升,所以e的值是4
对于i和j,sizeof括号里面都是表达式,i=i+j的值就是i的值,而i是int型的,故sizeof得到的结果是4;j是short型的,故sizeof(j=j+i)的值是2
知识要点
数组名
通常我们都不加思考的认为,数组名就是首元素的地址,和指针没有区别,然而实际上,数组名在不同的情境下具有不同的意义,包含它的表达式也会产生意想不到的效果。
以下是对数组名用法的总结
- sizeof(数组名),此时数组名表示整个数组,sizeof计算的是整个数组的大小
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址(表现在加减整数上)
- 除以上两种情况之外的数组名都表示整个首元素地址
指针类型
指针类型的意义,一是解引用是能访问的字节大小;二是指针加减整数时,指针指向位置跳过的字节数
sizeof与一维数组
#include<stdio.h>
int main()
{
int a[] = {
1,2,3,4 };//默认在32位平台下,单位为字节
printf("%d\n", sizeof(a));//16,这里a表示整个数组,4*4=16
printf("%d\n", sizeof(a + 0));//这里的a表示首元素地址,计算的是一个地址的大小,为4
printf("%d\n", sizeof(*a));//*a得到的是第一个元素,该元素为int型,大小为4
printf("%d\n", sizeof(a + 1));//a+1表示第二个元素的地址,地址大小为4
printf("%d\n", sizeof(a[1]));//第二个元素,int型,为4
printf("%d\n", sizeof(