这篇博客是写数组的相关运算,主要涉及 sizeof操作符、strlen函数、以及指针的使用。
数组名代表整个数组的时候只有两种情况:
sizeof(数组名),这里的数组名代表整个数组。
&数组名,这里的数组名表示整个数组。
sizeof和strlen区别
1. strlen(char*)函数求字符串实际长度,遇到字符’\0’停止,不包含字符’\0’。 sizeof()返回的是变量所占内存数,不是实际长度。
2. strlen是函数,sizeof是操作符(关键字)。
3. sizeof可以用类型(int,float)做参数,也可以用函数做参数;strlen只能用char*做参数
4. 数组做sizeof的参数不退化,而数组传递给strlen就退化为指针。
32位机器指针的长度为4,64位机器指针的长度为8.
int a[] = { 1, 2, 3, 4 }; //整形数组
printf("sizeof(a):%d\n", sizeof(a)); //a指数组名,整个整型数组的长度
printf("sizeof(a+0):%d\n", sizeof(a+0)); //a+0是指针,指针的长度
printf("sizeof(*a):%d\n", sizeof(*a)); //*a指向数组的首元素,数组首元素的长度
printf("sizeof(a+1):%d\n", sizeof(a+1)); //a+1是指针,指针的长度
printf("sizeof(a[1]):%d\n", sizeof(a[1])); //a[1]是指数组的第二个元素,数组元素的长度
printf("sizeof(&a):%d\n", sizeof(&a)); //&a是 数组名的地址,指针的指针,即指针的长度
printf("sizeof(&a+1):%d\n", sizeof(&a+1)); //&a的下一个地址,指针的长度
printf("sizeof(&a[0]):%d\n", sizeof(&a[0])); //数组首元素的地址,指针的长度
printf("sizeof(&a[0]+1)%d\n", sizeof(&a[0]+1)); //首元素地址的下一个地址,指针的长度
运算结果如下图:
char a[] = { 'a', 'b', 'c', 'd', 'e', 'f'}; //字符数组
printf("sizeof(a):%d\n", sizeof(a)); //a为数组名,整个数组的长度
printf("sizeof(a+0):%d\n", sizeof(a+0)); //a+0为指针,指针的长度
printf("sizeof(*a):%d\n", sizeof(*a)); //*a为数组首元素,数组首元素的长度
printf("sizeof(a+1):%d\n", sizeof(a+1)); //a+1为指针,指针的长度
printf("sizeof(a[1]):%d\n", sizeof(a[1])); //数组的第二个元素,数组元素的长度
printf("sizeof(&a):%d\n", sizeof(&a)); //&a为数组名的地址,即地址的地址,地址的长度
printf("sizeof(&a+1):%d\n", sizeof(&a+1)); //数组名地址的下一个地址,地址的长度
printf("sizeof(&a[0]):%d\n", sizeof(&a[0])); //数组首元素的地址,地址的长度
printf("sizeof(&a[0]+1):%d\n", sizeof(&a[0]+1)); //数组首元素地址的下一个地址,地址的长度
char *a = "abcdef"; //字符串,a为字符指针
printf("sizeof(a):%d\n", sizeof(a)); //指针的长度
printf("sizeof(a+1):%d\n", sizeof(a+1)); //指针的下一个地址,仍为指针,指针的长度
printf("sizeof(*a):%d\n", sizeof(*a)); //字符串的第一个位置,字符的长度
printf("sizeof(a[0]):%d\n", sizeof(a[0])); //字符串的第一个位置,字符的长度
printf("sizeof(&a):%d\n", sizeof(&a)); //字符指针的地址,仍为指针,指针的长度
printf("sizeof(&a+1):%d\n", sizeof(&a+1)); //指针的下一个地址,仍为指针,指针的长度
printf("sizeof(&a[0]+1)%d\n", sizeof(&a[0]+1)); //首元素地址的下一个位置,仍为指针,指针的长度
printf("strlen(a) : %d\n", strlen(a)); //从a所指向位置开始的字符串长度
printf("strlen(a+1) : %d\n", strlen(a+1)); //从a指向位置的下一个位置开始的字符串长度
printf("strlen(&a[0] + 1) : %d\n", strlen(&a[0] + 1)); //从a指向位置的下一个位置开始的字符串长度
int a[3][4] = { 0 }; //二维数组
printf("sizeof(a):%d\n", sizeof(a)); //a为整个数组,整个数组的长度
printf("sizeof(a[0][0]):%d\n", sizeof(a[0][0])); //第一行第一列元素的长度,int类型的长度
printf("sizeof(a[0]):%d\n", sizeof(a[0])); //第一行的长度,4*int类型的长度
printf("sizeof(a[0]+1):%d\n", sizeof(a[0]+1)); //int类型的长度
printf("sizeof(a+1):%d\n", sizeof(a+1)); //二维数组的第一个元素,int类型的长度
printf("sizeof(&a[0]+1):%d\n", sizeof(&a[0]+1)); //第一行元素的地址的下一个元素,地址的长度
printf("sizeof(*a)%d\n", sizeof(*a)); //第一行元素的长度
printf("sizeof(a[3])%d\n", sizeof(a[3])); //第四行元素的长度
以上为个人理解,如有错误请指出!!!