c语言数组、sizeof()及strlen()

一、数组
  1、int arr[10]={0};中 arr为该数组的数组名,10为数组所占空间,{}中为数组内容,int[10]表示数组类型。
  2、数组定义时若是初始化,则arr后必须注明次数组需用多少空间,{0}表示将数组中第一个元素初始化为零,其余元素默认为0。
  3、数组没定义大小时必须在后边注明内容。
  4、[]中必为常量,不可为变量。
  5、int arr1[10]={0}为整形数组,char arr3[]={'a','b','c'}为字符数组。
  6、数组大小计算sz=sizeof(arr)/sizeof(arr[0])。
二、指针
  1、指针是一个用来存放地址的变量。
  2、对于一维数组,除了sizeof(arr)\&arr外,其余的都代表数组首元素的地址。
  3、获得数组中每个元素的地址:数组名+整数(首元素地址+整数);&arr[i]
三、sizeof
       //整形数组
printf("%p\n", &a);
printf("%p\n", &a+1);
printf("%d\n", sizeof(*&a));
//&a表示整个数组的地址,加上*表示整个数组,这是一个包含四个元素的整型数组,所以占16个字节。


printf("%d\n",sizeof(a));//16
//数组名单独放到sizeof中时代表整个数组,因此sizeof(a)代表整个数组所占的内存,而这个数组a是一个整型数组每个元素占四个字节,四个元素总共占16个字节。
printf("%d\n",sizeof(a+0));//4
//数组名非单独放到sizeof中使用时代表数组首元素地址,因此sizeof(a+0)代表数组a中首 元素地址所占的内存,一个地址占四个字节。
printf("%d\n",sizeof(*a));//4
//同上,a代表首元素地址,而*a代表首元素,整型数组一个元素占四个字节,所以sizeof(*a)占四个字节。
printf("%d\n",sizeof(a+1));//4
//a在sizeof中非单独使用,代表首元素地址,a+1代表第二个元素的地址,所以也占四个字节。
printf("%d\n",sizeof(a[1]));//4
//a[1]代表数组中第二个元素,整型数组每个元素占四个字节。
printf("%d\n",sizeof(&a));//4
//a单独出现在&后边时代表整个数组,&a就代表着整个数组的地址,因为是地址,所以占四个字节。
printf("%d\n",sizeof(*&a));//16
//上述,a单独出现在&后面时,代表整个数组,&a表示整个数组的地址,加上*代表整个数组,即*&a代表整个数组所有的元素,占16字节。
printf("%d\n",sizeof(&a+1));//4
//&a代表整个数组的地址,之后加1,编程整个数组后面的地址,因为是地址,占四个字节。
printf("%d\n",sizeof(&a[0]));//4
//a[0]数组中第一个元素,取地址占四个字节。
printf("%d\n",sizeof(&a[0]+1));//4
//a[0]+1数组中第二个元素,取地址,占四个字节。

//字符数组
char arr[] = {‘a’,’b’,’c’,’d’,’e’,’f’};
printf(“%d\n”, sizeof(arr));//6
//数组名单独存在于sizeof后面代表整个数组,因为是字符数组,数组中每个元素占一个字节,所以6各元素总共占6个字节。
printf(“%d\n”, sizeof(arr+0));//4
//数组名非单独作用于sizeof后,代表数组首元素地址,首元素地址加上0还是首元素地址,占四个字节。
printf(“%d\n”, sizeof(*arr));//1
//同理 arr代表首元素地址,*arr代表首元素,因为是字符数组,一个元素占一个字节。
printf(“%d\n”, sizeof(arr[1]));//1
//arr[1]表示数组第二个元素,字符数组一个元素占一个字节。
printf(“%d\n”, sizeof(&arr));//4
// &arr 代表整个数组的地址,占四个字节。
printf(“%d\n”, sizeof(&arr+1));//4
// &arr+1代表整个数组后面相连的地址,占四个字节。
printf(“%d\n”, sizeof(&arr[0]+1));//4
//&arr[0]数组首元素的地址,加上1后表示数组第二个元素的地址,占四个字节。

char arr[] = “abcdef”;//[a b c d e f \0]
printf(“%d\n”, sizeof(arr));//7
//当使用一个字符串来给一个字符数组初始化时,系统会默认给字符串后面加上\0,也就是说这个字符数组中的元素,会比看到的abcdef元素多一个元素,所以数组中是有7个元素的,字符数组每个元素占一个字节,所以整个数组占7个字节。
printf(“%d\n”, sizeof(arr+0));//4
// 数组名非单独作用于sizeof函数后,仅作数组首元素的地址,加上0还是首元素地址,地址占4个字节。
printf(“%d\n”, sizeof(*arr));//1
//*arr 作为整个字符数组的首元素,占1个字节。
printf(“%d\n”, sizeof(arr[1]));//1
// arr[1]字符数组的第二个元素,占1个字节。
printf(“%d\n”, sizeof(&arr));//4
// 整个字符数组的地址,占4个字节。
printf(“%d\n”, sizeof(&arr+1));//4
// &arr+1,表示整个字符数组后面相连的那个地址,地址占1个字节。
printf(“%d\n”, sizeof(&arr[0]+1));//4
//字符数组首元素地址加1,也就是数组的第二个元素的地址,占1个字节。

//strlen 求一个字符串的长度,当作用于一个字符数组时,即从这个字符数组的首元素地址开始向后检查,每遇到一个字符则加1,直到遇到\0,或者NULL时停止,不然会生成随机数。
printf("%d\n", strlen(arr));//x
//x表示随机数,因为数组中没有‘\0’和NULL,所以函数strlen会一直向后面的地址检索,会生成随机数。
printf("%d\n", strlen(arr+0));//x
// 原因同上述
printf("%d\n", strlen(*arr));//err
//err 错误,程序崩溃,因为*arr表示字符数组的首元素字符a,a的ascii码会被当做地址赋给strlen函数,函数在读取时会发生错误。而致使程序崩溃。
printf("%d\n", strlen(arr[1]));//err
//  原因同上,arr[1]是字符数组的首元素。
printf("%d\n", strlen(&arr));//x
//  因为strlen函数运行时,无法检索到\0和NULL,所以会生成随机数。
printf("%d\n", strlen(&arr+1));//x
//原因同上
printf("%d\n", strlen(&arr[0]+1));//x
//原因同上


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值