!!‧✧̣̥̇‧✦‧✧̣̥̇‧✦ ‧✧̣̥̇:Solitary-walk
⸝⋆ ━━━┓
- 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━ ➴ ⷯ本人座右铭 : 欲达高峰,必忍其痛;欲戴王冠,必承其重。
自
信
希望在看完我的此篇博客后可以对你有帮助哟此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
sizeof():统计参数大小,单位是字节
strlen(): 是统计字符串长度的函数,只统计 \0 之前的字符个数,对应参数 类型必须是char*
//一维数组
int a[ ] = {1,2,3,4};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a+0));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(a[1]));
printf("%d\n",sizeof(&a));
printf("%d\n",sizeof(*&a));
printf("%d\n",sizeof(&a+1));
printf("%d\n",sizeof(&a[0]));
printf("%d\n",sizeof(&a[0]+1));
我们在做题之前需要先知道以下知识点:
1)数组名表示数组首元素的地址
2)但有2个例外:sizeof(数组名),这里的数组名表示整个数组,这个求的是整个数组的大小,单位是字节
3) &数组名:这里的数组表示整个数组,取出的是整个数组的地址
解析如下:
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));// 16 int类型数据占4个字节,所以此数组元素总的字节数是 4*4 = 16
printf("%d\n", sizeof(a + 0));// 4(x86环境) / 8(64环境) a+0表示首元素的地址,是地址就是4/8个字节
printf("%d\n", sizeof(*a));//4 sizeof(4) 4的数据类型是int类型
printf("%d\n", sizeof(a + 1));//4 a+1表示第二个元素地址,是地址就是4/8个字节
printf("%d\n", sizeof(a[1]));//4 求实等价于求sizeof(2)所占的字节数
printf("%d\n", sizeof(&a));// 4/8 &a取出的是整个数组地址,sizeof(&a)求的是整个数组地址,是地址就是4/8个字节
printf("%d\n", sizeof(*&a));// 16 &a取出的是整个数组的地址,之后在进行解引用,访问就是整给数组,所以此数组所占的字节数:4*4
printf("%d\n", sizeof(&a + 1));// 4/8 &a+1 跳过整个数组的地址,但是求的仍是数组的地址
printf("%d\n", sizeof(&a[0]));// 4 / 8 求的是数组首元素的地址
printf("%d\n", sizeof(&a[0] + 1));// 4 / 8 求的是第二个元素地址
printf("%d\n", sizeof(&a + 1));// 4/8 &a+1 跳过整个数组的地址,但是求的仍是数组的地址
2.字符数组
char arr[ ] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr+0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr+1));
printf("%d\n", sizeof(&arr[0]+1));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
首先我们对strlen()和sizeof()要先有基本的了解
解析如下:
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
以上2个代码是错误的,因为strlen()参数类型是char* 的指针
但实际传的并不是指针,而是一个字符,所以会报错
对应运行结果:
char *p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p+1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p+1));
printf("%d\n", sizeof(&p[0]+1));
printf("%d\n", strlen(p));
printf("%d\n", strlen(p+1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p+1));
printf("%d\n", strlen(&p[0]+1));
int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
总结: 数组名的意义:
1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
3. 除此之外所有的数组名都表示首元素的地址。
对应解析如下:
我们可以把二维数组看成是一维数组的数组
注意这里 a[0] 可不同于一维数组的a[0],这里的a[0] 表示:第一行元素所对应的数组名,同时也表示首元素的di'zh
printf("%d\n",sizeof(a[0]+1));
a[0]代表第一行元素的地址,对应类型是int*,指针+1跳过4个字节,此时a[0]+1指向第一行的第二列元素的地址,此时所求地址大小是 4 / 8字节
printf("%d\n",sizeof(*(a[0]+1)));
a[0]+1此时指向的是这个二维数组第一行第二列元素地址
*(a[0]+1)是对第一行第二列元素地址进行解引用,及取出的的元素 0,对应大小是4个字节