1.打印数组
char arr[] = {'a','b','c','d'};
printf("%s\n",arr);//%s打印字符串,%c打印单个字符
char arr[] = {'a','b','c','d','\0'};
printf("%s\n",arr);
char arr[] = "abcd";
printf("%s\n",arr);
在使用%s打印字符串时,遇到’\0’打印才会结束。与第二种、第三种情况相比,第一种情况种无’\0’,所以计算机会在打印完abcd后接着打印,直到遇到’\0’,才会结束打印
‘\0’是不可显示字符,%c、%s无法打印出来,但是可以通过ASCII码(%d)来打印字符’\0‘
2.数组名是什么?
int arr[] = {0,1,2,3,4,5,6,7,8,9};
printf("%p\n",arr);
printf("%p\n",&arr[0]);
printf("%p\n",&arr);
printf("%p\n",arr+1);
printf("%p\n",&arr[0]+1);
printf("%p\n",&arr+1);
arr与&arr[0]表示首元素地址,
故arr+1与&arr[0]+1均表示由首元素地址变为第二个元素的地址
在32位环境下,首元素地址+4,得到第二个元素地址
&arr表示的是数组的地址,但打印出来的仍是首元素地址!
其&arr+1表示跳过整个数组大小,
在32位环境下,首元素地址 +(4×10),跳过整个数组
十六进制:90(十进制:144)-十六进制:8C(十进制:140)= 4
十六进制:B4(十进制:180)-十六进制:8C(十进制:140)= 40
3.运算符sizeof()与函数strlen()
char arr[] = "abcd";
printf("%d\n",sizeof(arr)/sizeof(arr[0]));
printf("%d\n",strlen(arr));
char arr[] = {'a','b','c','d'};
printf("%d\n",sizeof(arr)/sizeof(arr[0]));
printf("%d\n",strlen(arr));
char arr[] = {'a','b','c','d','\0'};
printf("%d\n",sizeof(arr)/sizeof(arr[0]));
printf("%d\n",strlen(arr));
sizeof()是用来求内存所占空间大小的,会计入’\0’。sizeof(arr):整个数组大小除以sizeof(arr[0]):一个字符大小,得到字符串长度
strlen()函数是通过结束标识符’\0’来计算字符串长度的,但计算出来的字符串长度不包括’\0’
第一种情况:sizeof()/sizeof()会将’\0’算入; strlen()不会将’\0’算入
第二种情况:数组中没有结束标识符’\0’,sizeof()在没有结束标识符的情况下,仍可以计算; 当没有结束标识符时,函数strlen() 计算出来的结果是一个随机值
第三种情况:同第一种情况