C当中数组的相关运算
数组中的相关运算:
sizeof()求得是变量或者空间开辟空间的大小,而strlen()函数参数接收的必须是一个有效地址
#include <stdio.h>
#include <string.h>
int main()
{
//一维数组
int a[] = {1,2,3,4};
printf("%p\n", a); //输出数组a的地址,即数组首元素的地址
printf("%p\n", a+1); //数组下一个元素的地址,即2的地址
printf("%d\n", sizeof(*a)); //4 计算数组a第一个元素的大小
printf("%p\n", &a); //输出数组a的地址,即数组首元素的地址
printf("%p\n", &a+1); //输出跳过数组a之后的地址
printf("%d\n", sizeof(*&a));//16 输出整个数组的大小
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 数组a首元素的地址
printf("%d\n",sizeof(*&a));//16 整个数组a的大小
printf("%d\n",sizeof(&a+1));//4 数组a第二个元素的地址
printf("%d\n",sizeof(&a[0]));//4 数组a第一个元素的地址
printf("%d\n",sizeof(&a[0]+1));//4 数组a第一个元素的地址+1,还是地址
//字符数组
//char arr[] = {'a','b','c','d','e','f'};
char arr[] = "abcdef";//[a b c d e f \0]
printf("%d\n", sizeof(arr));//7 计算数组的大小
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 首元素地址+1,还是地址
printf("%d\n", strlen(arr));//6 数组中字符的长度,遇到'\0'停止
printf("%d\n", strlen(arr+0));//6 数组中字符的长度
printf("%d\n", strlen(*arr));//err 出错,把第一个元素当做地址处理,无法访问
printf("%d\n", strlen(arr[1]));//err 出错,把第一个元素当做地址处理,无法访问
printf("%d\n", strlen(&arr));//6 整个数组的地址,即首元素地址
printf("%d\n", strlen(&arr+1));//x 随机值,跳过整个数组的地址,无法预测
printf("%d\n", strlen(&arr[0]+1));//5 从第二个元素开始知道'\0'停止
return 0;
}
int main()
{
char *p = "abcdef";//
printf("%d\n", strlen(p));//6 p相当于arr,代表首元素地址
printf("%d\n", strlen(p+1));//5 第二个元素开始
printf("%d\n", strlen(*p));//err 把a的ascii值当做地址查找无法访问,出错
printf("%d\n", strlen(p[0]));//err 把a的ascii值当做地址查找无法访问,出错
printf("%d\n", strlen(&p));//X 从a当中的地址开始查字符,不知道是否为0停止
printf("%d\n", strlen(&p+1));// 从b当中的地址开始查,不知道是否为0停止
printf("%d\n", strlen(&p[0]+1));//5 从第二个元素开始查找字符,知道'\0'停止
printf("%d\n", sizeof(p));//4 p相当于arr,是数组的首元素地址
printf("%d\n", sizeof(p+1));//4 下一个元素的地址
printf("%d\n", sizeof(*p));//1 字符a的大小
printf("%d\n", sizeof(p[0]));// 1-- *(p+0) 字符a的大小
printf("%d\n", sizeof(&p));//4 首元素地址的大小
printf("%d\n", sizeof(&p+1));//4 跳过p的地址,还是地址
printf("%d\n", sizeof(&p[0]+1));//4 字符b的地址
return 0;
}