在我们数组的运算当中,经常会碰到或者用到求数组的长度,求数组中某一个元素的地址的长度或者是数组的运用。
我们经常会搞混sizeof和strlen在不同类型数组中的应用,因此我在这里详细的罗列出来我们常见的以及常用的一些典型例子。
通过程序的方式加注释 方便大家理解,而且可以实时验证。
在下面的注释中,X表示随机值,error表示该语句错误。
程序在32位平台下运行的结果:
#include <stdio.h>
#include <windows.h>
#include <string.h>
int main()
{
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 表示第一行第一个元素的地址
printf("%d\n", sizeof(a + 1)); //4 表示第二行的地址
printf("%d\n", sizeof(&a[0] + 1));//4 表示第二行第一个元素的地址
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 表示第一个元素的大小
printf("%d\n", sizeof(&arr)); //4 表示整个字符串的地址
printf("%d\n", sizeof(&arr + 1)); //4 向字符串后面的地址
printf("%d\n", sizeof(&arr[0] + 1));//4 表示第二个字符的地址
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 *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 表示第二个字符的地址
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从第二个字符开始
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 表示第二个元素的大小
printf("%d\n", sizeof(&arr)); //4 表示整个数组的地址
printf("%d\n", sizeof(&arr+1)); //4 表示跳出这个数组的地址
printf("%d\n", sizeof(&arr[0]+1)); //4 表示第二个元素的地址
//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 表示第二个元素的地址,但是遇不到\0,值不确定
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 表示第二个元素的地址
printf("%d\n", sizeof(a[1])); //4 表示第二个元素的大小
printf("%d\n", sizeof(&a)); //4 表示整个数组的地址
printf("%d\n", sizeof(&a+1)); //4 表示跳出这个数组的地址
printf("%d\n", sizeof(&a[0])); //4 表示第一个元素的地址
printf("%d\n", sizeof(&a[0]+1));//4 表示第二个元素的地址
system("pause");
return 0;
}
如果读者在查看的过程当中发现错误,还望您及时联系,帮助我修改错误!