目录
前言:指针与数组的知识往往让我们无法给自己定位,似乎是懂了,但真的碰上了又一言难尽。接下来有一些关于指针与数组的知识和例题讲解,来看看你对指针和数组到底有多了解吧!
指针与数组中的sizeof与strlen
1、sizeof
sizeof值关注占用空间的大小,单位是字节,不关注元素的类型,是一个操作符。
2、strlen
strlen是计算字符串中\0之前出现了多少个字符,只针对字符串,是一个库函数。
3、数组名
数组名是数组首元素地址,但是在这里有两个例外:
(1)sizeof(数组名),这里的数组名表示的是整个数组,计算的是整个数组的大小,单位是字节。
(2)&数组名,这里的数组名也表示整个数组,取出的是数组的地址
除了上面两种情况外,所有的数组名表示的都是数组首元素地址。
下面我们就来看一看数组、指针的一些运用
1、一维数组
整型数组
#include<stdio.h> int main() { //一维数组 int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));// 16 printf("%d\n",sizeof(a+0));// 4/8 printf("%d\n",sizeof(*a));// 4 printf("%d\n",sizeof(a+1));// 4/8 printf("%d\n",sizeof(a[1]));// 4 printf("%d\n",sizeof(&a));// 4/8 printf("%d\n",sizeof(*&a));// 16 printf("%d\n",sizeof(&a+1));// 4/8 printf("%d\n",sizeof(&a[0]));// 4/8 printf("%d\n",sizeof(&a[0]+1));// 4/8 return 0; }
接下来我们就一句一句讲解:
sizeof(a)
数组名a单独放在sizeof内部,计算的是整个数组的大小,单位是字节,所以计算结果:4*4=16个字节。
sizeof(a+0)
a没有单独存放,所以表示的是首元素的地址,a+0还是数组首元素的地址,是地址的话大小就是4/8个字节。(在32位环境下为4,64位环境下为8)
sizeof(*a)
a表示的是首元素的地址,*a就是对首元素的地址解引用,所以就是首元素,大小为4个字节
sizeof(a+1)
a表示首元素地址,a+1就是第二个元素的地址,是地址的话大小就是4/8个字节。
sizeof(a[1])
a[1]表示数组的第二个元素,大小是4个字节。
sizeof(&a)
&a表示的是整个数组的地址,数组的地址也是地址,所以大小为4/8个字节。
sizeof(*&a)
&a是数组的地址,类型是int(*)[4],是一个数组指针,如果解引用,访问的就是4个int的数组,可以理解为*与&抵消效果,所以*&a相当于a,所以sizrof(a)是16。
sizeof(&a+1)
&a是数组地址,&a+1跳过整个数组后的地址,是地址就是4/8个字节大小。
sizeof(&a[0])
&a[0]取出的是数组第一个元素的地址,是地址就是4/8个字节大小。
sizeof(&a[0]+1)
&a[0]+1就是第二个元素的地址,是地址大小就是4/8个字节。
字符数组
#include<stdio.h> int main() { //字符数组 char arr[] = {'a','b','c','d','e','f'}; printf("%d\n", sizeof(arr));// 6 printf("%d\n", sizeof(arr+0));// 4/8 printf("%d\n", sizeof(*arr));// 1 printf("%d\n", sizeof(arr[1]));// 1 printf("%d\n", sizeof(&arr));// 4/8 printf("%d\n", sizeof(&arr+1));// 4/8 printf("%d\n", sizeof(&arr[0]+1));// 4/8 printf("%d\n", strlen(arr));// 随机值 printf("%d\n", strlen(arr+0));// 随机值 printf("%d\n", strlen(*arr));// err printf("%d\n", strlen(a