【C语言】进阶指针Ⅵ 指针和数组练习。

时间:2022-12-19 19:02:46


 ???? 指针和数组练习

①. 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那么就是第二个元素的地址。

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

16
4
4
4
4

4
16
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找到第二个元素的地址

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

6
4
1
1
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));

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

随机值

随机值

报错 - 不是合法地址

报错 - 不是合法地址 

随机值

随机值

随机值

????注意:上列数组是没有'\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));

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

7
4
1
1
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));

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

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'的地址

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

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'的地址。

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

6
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]起始是第四行的数组名(如果有)即使不存在也可以通过类型计算大小。

【C语言】进阶指针Ⅵ 指针和数组练习。

编译运行结果????

48
4
16
4
4
4
16
4
16
16
16