💥 指针和数组练习
①. sizeof(数组名) - 数组名表示整个数组,计算的是整个数组大小,单位是字节√
②. &数组名 - 数组名表示整个数组,取出的是整个数组的地址√
③. 除此之外所有的数组名都是代表数组首元素的地址√
💥注意:以上在32位平台上是4个字节,如果你是在64位的平台上那就是8个字节了。(在这里我们使用的是32位地址)
🔥 整形数组 - sizeof()
示例,如下代码所示 👇
int a[] = { 1, 2, 3, 4 };
printf("%d\n",sizeof(a)); //计算整个数组的地址。
printf("%d\n",sizeof(a+0)); //这个不是单独放在sizeof()的内部,而是把(a+0)给一起放进去了。所以它表示的是首元素的地址。
printf("%d\n",sizeof(*a)); //*a是数组的第一个元素,所以计算的是第一个元素的大小。
printf("%d\n",sizeof(a+1)); //(a+1)是计算第二个元素的地址。
printf("%d\n",sizeof(a[1]));//计算数组下标第二个元素的地址。
printf("%d\n",sizeof(&a)); //&a,虽然是数组的地址,但是也是地址。所以,sizeof(&a)计算的是一个地址的大小。
printf("%d\n",sizeof(*&a)); //取出a的地址再进行解引用,指针是能够指向数组的地址。
printf("%d\n",sizeof(&a+1));//数组后面空间的地址,跳过一个数组地址。
printf("%d\n", sizeof(&a[0]));//取出第一个元素下标的地址
printf("%d\n", sizeof(&a[0] + 1));//取出第一个元素下标地址再加1那么就是第二个元素的地址。
编译运行结果👇
16
4
4
4
4
4
16
4
4
4
🔥 字符数组 - sizeof()
示例,如下代码所示 👇
char arr[] = { 'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));//计算整个数组的地址,注意数据类型。
printf("%d\n", sizeof(arr + 0));//表示首元素的地址,注意字符所占空间大小是1个字节。但是它是地址所以是4个字节
printf("%d\n", sizeof(*arr));//数组指针进行解引用,找到元素a的地址。
printf("%d\n", sizeof(arr[1]));//数组名第下标找到第二个字节。
printf("%d\n", sizeof(&arr));//取地址arr,arr是个地址。
printf("%d\n", sizeof(&arr + 1));//取出数组arr的地址加1跳过arr数组到‘f’的后面
printf("%d\n", sizeof(&arr[0] + 1));//取出arr下标第一个地址,再加1找到第二个元素的地址
编译运行结果👇
6
4
1
1
4
4
4
🔥 求字符串长度 - strlen()
示例,如下代码所示 👇 字符串长度头文件是#include<string.h>
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
编译运行结果👇
随机值
随机值
报错 - 不是合法地址
报错 - 不是合法地址
随机值
随机值
随机值
💥注意:上列数组是没有'\0',而'\0'是字符串长度的结束标志。
🔥 字符串数组 - sizeof()
示例,如下代码所示 👇
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));//首元素地址加0,还是首元素地址。
printf("%d\n", sizeof(*arr));//第一个元素'a'进行解引用。
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));//arr取出的是整个数组的地址,但还是地址。
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
编译运行结果👇
7
4
1
1
4
4
4
💥注意:这里是字符串数组所以当中是有'\0'!
🔥 字符串数组 - strlen()
示例,如下代码所示 👇 从起始位置开始遇到'\0'停止
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
编译运行结果👇
6
6
报错 - 不是合法地址
报错 - 不是合法地址
6
随机值
5
🔥 字符串指针 - sizeof()
示例,如下代码所示 👇
char *p = "abcdef";
printf("%d\n", sizeof(p)); //算出的是指针变量的大小。
printf("%d\n", sizeof(p+1)); //p+1是是b的地址,但它还是个地址。
printf("%d\n", sizeof(*p)); //指针解引用首元素的地址
printf("%d\n", sizeof(p[0]));//当成数组的形式取访问等价*(p+0)
printf("%d\n", sizeof(&p)); //取地址p取的也是p的地址
printf("%d\n", sizeof(&p + 1));//取出p的地址加1跳过p的地址
printf("%d\n", sizeof(&p[0] + 1));//第一个元素地址+1就是'b'的地址
编译运行结果👇
4
4
1
1
4
4
4
🔥 字符串指针 - strlen()
示例,如下代码所示 👇
char *p = "abcdef";
printf("%d\n", strlen(p)); //p里面存放的是a的地址,向后数字符遇到'\0'就停下。
printf("%d\n", strlen(p + 1));//p+1是b的地址,向后数字符遇到'\0'就停下。
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));//取出第一个元素地址+1就是'b'的地址。
编译运行结果👇
6
5
报错 - 不是合法地址
报错 - 不是合法地址
随机值
随机值
5
🔥 二维数组 - sizeof()
示例,如下代码所示 👇
int a[3][4] = { 0 };
// (0)(1)(2)(3)
//(0) 0 0 0 0
//(1) 0 0 0 0
//(2) 0 0 0 0
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a[0][0]));
printf("%d\n", sizeof(a[0])); //就可以理解成:第一行的数组名。
printf("%d\n", sizeof(a[0]+1));//a[0]就是第一行第一个元素的地址,a[0]+1就是第一行第二个元素的地址。
printf("%d\n", sizeof(*(a[0] + 1)));//a[0]+1就是第一行第二个元素的地址,然后对其进行解引用整形类型元素。
printf("%d\n", sizeof(a + 1));//a代表的是首元素的地址,然后+1。
printf("%d\n", sizeof(*(a + 1)));//第二行的地址进行解引用
printf("%d\n", sizeof(&a[0] + 1));//取出第一行的地址然后加1就代表第二行的地址。
printf("%d\n", sizeof(*(&a[0] + 1)));//第二行地址,解引用计算第二行的地址。
printf("%d\n", sizeof(*a));//表示第一行首元素的地址进行解引用得到第一行
printf("%d\n", sizeof(a[3]));//这里可以推测类型,a[3]起始是第四行的数组名(如果有)即使不存在也可以通过类型计算大小。
编译运行结果👇
48
4
16
4
4
4
16
4
16
16
16