【C语言】指针和数组(2)

举报
謓泽 发表于 2023/09/30 16:33:22 2023/09/30
【摘要】 【C语言】指针和数组(2)

🔥 字符串指针 - 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
报错 - 不是合法地址
报错 - 不是合法地址
随机值
随机值

🔥 二维数组 - 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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。