#数组的相关运算:sizeof和strlen的区别与应用
- 数组名单独放在sizeof()内部,数组名表示整个数组,所以sizeof(数组名)计算的是整个数组的大小,单位是字节
- &数组名,数组名表示整个数组,所以&数组名取出的是整个数组的地址
- 除此之外,所有的数组名都表示首元素的地址
程序代码及运行结果如下:
#include <stdio.h>
#include <string.h>
int main()
{
int a[] = {1,2,3,4};//一维数组
printf("%d\n", sizeof(a)); //16 表示整个数组的大小
printf("%d\n", sizeof(a+0)); //4 表示首元素的地址
printf("%d\n", sizeof(*a)); //4 表示首元素的大小
printf("%d\n", sizeof(a+1)); //4 表示a[1]的地址
printf("%d\n", sizeof(a[1])); //4 表示a[1]的大小
printf("%d\n", sizeof(&a)); //4 表示整个数组的地址
printf("%d\n", sizeof(&a+1)); //4 表示跳出这个数组的地址
printf("%d\n", sizeof(&a[0])); //4 表示a[0]的地址
printf("%d\n", sizeof(&a[0]+1));//4 表示a[1]的地址
int a[3][4] = {0};//二维数组
printf("%d\n", sizeof(a)); //48 表示二维数组的大小
printf("%d\n", sizeof(a[0][0])); //4 表示首元素的大小
printf("%d\n", sizeof(a[0])); //16 表示第一行的大小
printf("%d\n", sizeof(a[0] + 1)); //4 表示a[0][1]的地址
printf("%d\n", sizeof(a + 1)); //4 表示第二行a[1][0]的地址
printf("%d\n", sizeof(&a[0] + 1));//4 表示a[1][0]的地址
printf("%d\n", sizeof(*a)); //16 第一行元素的大小
printf("%d\n", sizeof(a[3])); //16 虽然超出了定义,但还是按类型计算
char arr[] = "abcdef";//字符数组
printf("%d\n", sizeof(arr)); //7 表示数组的大小,有\0
printf("%d\n", sizeof(arr + 0)); //4 表示首元素的地址
printf("%d\n", sizeof(*arr)); //1 表示首元素的大小
printf("%d\n", sizeof(arr[1])); //1 表示arr[1]的大小
printf("%d\n", sizeof(&arr)); //4 表示整个字符串的地址
printf("%d\n", sizeof(&arr + 1)); //4 向字符串后面的地址
printf("%d\n", sizeof(&arr[0] + 1));//4 表示a[1]的地址
//strlen(起始位置)(给一个地址,strlen去找)
printf("%d\n", strlen(arr)); //6 表示字符串的长度
printf("%d\n", strlen(arr+0)); //6 指向a,开始往后找
printf("%d\n", strlen(*arr)); //error 从97开始找,给了一个错误的地址
printf("%d\n", strlen(arr[1])); //error 从98开始找,给了一个错误的地址
printf("%d\n", strlen(&arr)); //6 表示整个数组的长度,不算\0
printf("%d\n", strlen(&arr + 1)); //x 跳出数组,随机值
printf("%d\n", strlen(&arr[0] + 1));//5 表示从b开始
char arr[] = {'a','b','c','d','e','f'};//字符数组
printf("%d\n", sizeof(arr)); //6 表示整个数组的大小
printf("%d\n", sizeof(arr+0)); //4 表示首元素的地址
printf("%d\n", sizeof(*arr)); //1 表示首元素的大小
printf("%d\n", sizeof(arr[1])); //1 表示arr[1]的大小
printf("%d\n", sizeof(&arr)); //4 表示整个数组的地址
printf("%d\n", sizeof(&arr+1)); //4 表示跳出这个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //4 表示arr[1]的地址
//strlen(起始位置)(给一个地址,strlen去找)
printf("%d\n", strlen(arr)); //x 表示首元素的地址,但是遇不到\0,随机值
printf("%d\n", strlen(arr + 0)); //x 表示首元素的地址,但是遇不到\0,随机值
printf("%d\n", strlen(*arr)); //error 从97开始找,给了一个错误的地址
printf("%d\n", strlen(arr[1])); //error 从98开始找,给了一个错误的地址
printf("%d\n", strlen(&arr)); //x 表示这整个数组的地址,但是遇不到\0,随机值
printf("%d\n", strlen(&arr + 1)); //x 表示跳出这个数组的地址,随机值
printf("%d\n", strlen(&arr[0] + 1));//x 表示arr[1]的地址,但是遇不到\0,随机值
char *p = "abcdef";//指针数组
printf("%d\n", sizeof(p)); //4 表示指针的大小
printf("%d\n", sizeof(p+1)); //4 表示第二个字符的地址
printf("%d\n", sizeof(*p)); //1 表示第一个字符的大小
printf("%d\n", sizeof(p[0])); //1 表示第一个字符的大小
printf("%d\n", sizeof(&p)); //4 表示整个字符串的地址
printf("%d\n", sizeof(&p+1)); //4 向字符串后面的地址
printf("%d\n", sizeof(&p[0]+1)); //4 表示第二个字符的地址
//strlen(起始位置)(给一个地址,strlen去找)
printf("%d\n", strlen(p)); //6 表示字符串的长度
printf("%d\n", strlen(p+1)); //5 指向b
printf("%d\n", strlen(*p)); //error 从97开始找,给了一个错误的地址
printf("%d\n", strlen(p[0])); //error 从98开始找,给了一个错误的地址
printf("%d\n", strlen(&p)); //x 从p的地址开始,找不到对应的字符,随机值
printf("%d\n", strlen(&p + 1)); //x 跳出地址,从地址之外开始,随机值
printf("%d\n", strlen(&p[0] + 1));//5从第二个字符开始
return 0;
}
注:
- 注释为程序在32bit平台下运行的结果
- x表示随机值,error表示该语句错误
如有错误,烦请私信以便及时修改,万分感谢。