您的位置:首页 > 编程语言 > C语言/C++

sizeof 和 strlen 的深入理解

2017-04-05 01:30 169 查看
话不多说,全在图里。
一、一维整形数组sizeof
#include<stdio.h>
#include<Windows.h>

int main()
{
int a[]={1,2,3,4};
printf("%d\n",sizeof(a));
//16 数组名单独存放在sizeof内部,输出的是数组长度,int型四个元素那么就是16个字节。
printf("%d\n",sizeof(a+0));
//4 此时的a是首元素地址,+i表示向后偏移指针指向元素类型的大小*i个字节
printf("%d\n",sizeof(*a));
//4 解引用首元素地址就是首元素,int类型的首元素地址为4个字节
printf("%d\n",sizeof(a+1));
//4 首元素地址+1*4即表示第二个元素,int型即为4
printf("%d\n",sizeof(a[1]));
//4 表示第二个元素的大小
printf("%d\n",sizeof(&a));
//4 a为首元素的地址,&a就表示数组的地址
printf("%d\n",sizeof(*&a));
//16 &a表示数组的地址,再解引用就是整个数组
printf("%d\n",sizeof(&a+1));
//4 数组的地址+1表示跳出这个数组,出来之后还是一个地址,一个地址四个字节
printf("%d\n",sizeof(&a[0]));
//4 第一个元素的地址类型大小
printf("%d\n",sizeof(&a[0]+1));
//4 第二个元素的地址类型大小
system("pause");
return 0;

}
验证无误:




二、一维字符数组sizeof

#include<stdio.h>
#include<Windows.h>

int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//6 整个数组的大小,arr中包含6个char类型元素
printf("%d\n", sizeof(arr +0));
//4 表示首元素的地址 一个地址是4个字节
printf("%d\n", sizeof(*arr));
//1 arr为首元素地址 *arr就表示第一个元素即a字符的大小
printf("%d\n", sizeof(arr[1]));
//1 指的是第二个该数组中第二个字符的大小
printf("%d\n", sizeof(&arr));
//4 表示数组的地址,一个地址大小为4个字节
printf("%d\n", sizeof(&arr+1));
//4 跳出该数组后的地址,一个地址大小为4个字节
printf("%d\n", sizeof(&arr[0]+1));
//4 表示该数组中第一个字符后的字符的地址大小,也就是字符b的地址大小
return 0;
}
验证无误:



三、一维字符数组strlen

#include<stdio.h>
#include<Windows.h>

int main()
{
char arr[]={'a','b','c','d','e','f'};
printf("%d\n", strlen(arr));
//随机值 strlen判断字符串长度直到遇到\0才停止计数
printf("%d\n", strlen(arr+0));
//随机值 和上个值相同
//printf("%d\n", strlen(*arr));
//报错 *arr解引用找到首元素‘a’, a的ASCLL码值为97,即strlen(97)
//我们将错误的地址给了strlen,所以编译器报错就不在运行
//printf("%d\n", strlen(arr[1]));
//错误
//arr[1]代表的是字符b,对应的ASCLL码值为98,同理
printf("%d\n", strlen(&arr));
//随机值
printf("%d\n", strlen(&arr+1));
//随机值
printf("%d\n", strlen(&arr[0]+1));
//随机值
system("pause");
return 0;
}
验证:随机值 不同用户操作会产生不一样的值



四、二维整形数组sizeof

// 二维数组
#include<stdio.h>
#include<Windows.h>

int main()
{
int a[3][4] = {0};
printf("%d\n",sizeof(a));
//48 整个数组的大小,3*4*4=48
printf("%d\n",sizeof(a[0][0]));
//4 数组第一个元素类型的大小
printf("%d\n",sizeof(a[0]));
//16 表示第一行素组内容的大小
printf("%d\n",sizeof(a[0]+1));
//4 第一行第二个元素的大小
printf("%d\n",sizeof(a+1));
//4 第一行的地址加一,表示第二行的地址
printf("%d\n",sizeof(&a[0]+1));
//4 &a[0]取出的是第一行的地址,加一指向第二行第一个元素
printf("%d\n",sizeof(*a));
//16 第一行的大小
printf("%d\n",sizeof(&a[3]));
//4 表示第三行数组的地址

system("pause");
return 0;
}
验证无误:



That's all,thanks!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言