有关数组的运算(sizeof和strlen)

// 一维数组
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表示2的地址
printf("%d\n",sizeof(a[1]));    //4
printf("%d\n",sizeof(&a));    //4,整个数组的地址,地址占4个字节
printf("%d\n",sizeof(*&a));   //16
printf("%d\n",sizeof(&a+1));  //4,整个数组的地址爱加1,表欧式下一个数组的地址
printf("%d\n",sizeof(&a[0]));  //4
printf("%d\n",sizeof(&a[0]+1));  、//4

//字符数组
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


printf("%d\n", strlen(arr));    //随机数,因为strlen遇到'\0'才会结束
printf("%d\n", strlen(arr+0));   //随机数
printf("%d\n", strlen(*arr));   //错误,因为strlen接收的是地址
printf("%d\n", strlen(arr[1]));    //错误
printf("%d\n", strlen(&arr));   // 随机数
printf("%d\n", strlen(&arr+1));   //随机数
printf("%d\n", strlen(&arr[0]+1));   //随机数


char arr[] = "abcdef";

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


printf("%d\n", strlen(arr));   //6     ,strlen不计算'\0'
printf("%d\n", strlen(arr+0));    //6
printf("%d\n", strlen(*arr));    //错
printf("%d\n", strlen(arr[1]));    //错
printf("%d\n", strlen(&arr));    //6
printf("%d\n", strlen(&arr+1));    //随机,表示下一个数组
printf("%d\n", strlen(&arr[0]+1));     //5


char *p = "abcdef";    //p指向首元素a

printf("%d\n", sizeof(p));     //4,a的地址
printf("%d\n", sizeof(p+1));     //4,b的地址
printf("%d\n", sizeof(*p));    //1,a
printf("%d\n", sizeof(p[0]));    //1,a
printf("%d\n", sizeof(&p));    //4,对指针变量取地址,即二级指针
printf("%d\n", sizeof(&p+1));     //4,指针的地址加1,实则加4(char *)
printf("%d\n", sizeof(&p[0]+1));     //4


printf("%d\n", strlen(p));    //6
printf("%d\n", strlen(p+1));     //5
printf("%d\n", strlen(*p));     //错
printf("%d\n", strlen(p[0]));     //错
printf("%d\n", strlen(&p));     //随机,二级指针
printf("%d\n", strlen(&p+1));     //随机,二级指针
printf("%d\n", strlen(&p[0]+1));     //5


//二维数组

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,第一个元素的首元素地址,在加1,表示a[0][1]的地址
printf("%d\n",sizeof(a+1));       //4,a表示首元素地址,在加1,表示第二个元素的地址(类型为数组)
printf("%d\n",sizeof(&a[0]+1));     //4,同上
printf("%d\n",sizeof(*a));          //16,a表示首元素(类型为数组)解引用有四个元素
printf("%d\n",sizeof(a[3]));   //16,不会越界例如上篇博客指针比较。原因:由于sizeof()内部在链接之后执行,而sizeof在编译时执行,所以内部不会运算,也不会报错。


【总结】
数组名代表整个数组只有两种情况
1.sizeof(数组名),这里数组名表示整个数组。
2.&数组名,这里数组名表示整个数组。

点击打开

感谢关注!

我会持续更新的哦!


猜你喜欢

转载自blog.csdn.net/weixin_41318405/article/details/80169612