【C语言】进阶指针seven

131 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

🚩write in front🚩

🔎大家好,我是泽奀,希望你看完后。能对你有所帮助,不足请指正,共同学习交流🔎
🆔本文由 謓泽 原创 如需转载还请通知⚠
📝个人主页-掘金 (juejin.cn)💬
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
📣系列专栏-[C系列] 从0到1 - 泽奀的专栏 - 掘金 (juejin.cn)🎓
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩

💥 指针和数组练习

 ①. 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代表的是首元素的地址,然后+1printf("%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