C语言--数组与指针传参的老大难问题--题型训练

       前言

        强人才能锁男, 老人可不行!!!   变秃与变强,我选择了秃右强!!


目录

       题型强训

      数组传参

指针传参


       题型强训
      数组传参
int main()
{
	

	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));                 //表示 整个数组的大小  16
	printf("%d\n", sizeof(a + 0));             //表示 首元素的地址的大小  4
	printf("%d\n", sizeof(*a));                //表示 第一个元素的大小  4
	printf("%d\n", sizeof(a + 1));             //表示 第二个元素的地址的大小 4
	printf("%d\n", sizeof(a[1]));              //表示 第二个元素的大小  4
	printf("%d\n", sizeof(&a));                //表示 整个数组的地址的大小  4
	printf("%d\n", sizeof(*&a));               //表示 数组所有元素的长度 16
	                                           //&a的类型为: int (*)[4]   一个数组指针的类型,对这个数组指针进行解引用,访问的就是整个数组
	printf("%d\n", sizeof(&a + 1));            //表示 数组后的一个地址的大小  4
	printf("%d\n", sizeof(&a[0]));             //表示 首元素的地址的大小  4
	printf("%d\n", sizeof(&a[0] + 1));         //表示 第二个元素的地址的大小 4

	char arr[] = { 'a','b','c','d','e','f' };  //该字符数组是用单个字符进行初始化的,所以数组内部没有 \0
	printf("%d\n", sizeof(arr));               //表示的是 整个数组的大小 6
	printf("%d\n", sizeof(arr + 0));           //表示的是 数组首元素的地址的大小 4
	printf("%d\n", sizeof(*arr));              //表示的是 数组首位元素的大小  1
	printf("%d\n", sizeof(arr[1]));            //表示的是 数组第二个元素的大小  1
	printf("%d\n", sizeof(&arr));              //表示的是 整个数组的地址的大小  4
	printf("%d\n", sizeof(&arr + 1));          //表示的是 数组第二个元素的地址的大小 4
	printf("%d\n", sizeof(&arr[0] + 1));       //表示的是 数组中第二个元素的地址的大小 4
  
	printf("%d\n", strlen(arr));               // 表示的整个数组的大小  随机值  因为数组中没有 \0
	printf("%d\n", strlen(arr + 0));           // 表示的整个数组的大小   随机值
	//printf("%d\n", strlen(*arr));            // 格式错误 这里传参传的是元素,strlen函数需要传地址
    //	printf("%d\n", strlen(arr[1]));    // 格式错误  原因同上
	printf("%d\n", strlen(&arr));              // 传的整个数组的地址,  随机值
	printf("%d\n", strlen(&arr + 1));          // 传的数组后的地址, 随机值-6
	printf("%d\n", strlen(&arr[0] + 1));       // 传的第二个元素的地址,   随机值-1


	return 0;
}
int main()
{
    char arr[] = "abcdef";                     // 以字符串的形式初始化数组,末位会自动补\0
	printf("%d\n", sizeof(arr));               // 表示的是 整个数组的大小,\0也会计算在内  7
	printf("%d\n", sizeof(arr + 0));           // 表示的是 数组首元素的地址的大小  4
	printf("%d\n", sizeof(*arr));              // 表示的是 数组首元素的大小 1
	printf("%d\n", sizeof(arr[1]));            // 表示的是 数组第二个元素的大小 1
	printf("%d\n", sizeof(&arr));              // 表示的是 整个数组的地址的大小 4
	printf("%d\n", sizeof(&arr + 1));          // 表示的是 数组后一个地址的大小 4
	printf("%d\n", sizeof(&arr[0] + 1));       // 表示的是 数组第二个元素的地址的大小 4
	printf("%d\n", strlen(arr));               // 表示 整个数组的长度 6
	printf("%d\n", strlen(arr + 0));           // 表示 传的数组首元素的地址,表示整个数组的大小 6
	//printf("%d\n", strlen(*arr));              // 格式错误  传的元素
	//printf("%d\n", strlen(arr[1]));            // 格式错误  原因同上
	printf("%d\n", strlen(&arr));              // 表示 整个数组的大小,传的整个数组的地址, 6
	printf("%d\n", strlen(&arr + 1));          // 表示 从整个数组结束(跳过了\0) 到下一个\0 之间的长度, 随机值
	printf("%d\n", strlen(&arr[0] + 1));       // 表示 剩余数组的大小,传的是数组中第二个元素的地址, 5

    return 0;
}
int main()
{
    int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));            //表示 整个数组的大小 48
	printf("%d\n", sizeof(a[0][0]));      //表示 第一行第一列的元素的大小 4
	printf("%d\n", sizeof(a[0]));         //表示 第一行元素的大小 16
	printf("%d\n", sizeof(a[0] + 1));     //表示 第二行元素地址的大小 4
	printf("%d\n", sizeof(*(a[0] + 1)));  //表示 第一行第二列的元素的大小 4
	printf("%d\n", sizeof(a + 1));        //表示 第二行元素地址的大小 4
	printf("%d\n", sizeof(*(a + 1)));     //表示 第二行元素的大小 16
	printf("%d\n", sizeof(&a[0] + 1));    //表示 第二行元素地址的大小 4
	printf("%d\n", sizeof(*(&a[0] + 1))); //表示 第二行元素的大小 16
	printf("%d\n", sizeof(*a));           //表示 第一行元素的大小 16
	printf("%d\n", sizeof(a[3]));         //表示 越界,但是是表示第四行地址的大小 16

    return 0;
}
指针传参
int main()
{
    char* p = "abcdef";
	printf("%d\n", sizeof(p));           //表示 元素a地址的大小 4
	printf("%d\n", sizeof(p + 1));       //表示 元素b地址的大小 4
	printf("%d\n", sizeof(*p));          //表示 元素a的大小 1
	printf("%d\n", sizeof(p[0]));        //表示 元素a的大小 1
	printf("%d\n", sizeof(&p));          //表示 指针p地址的大小  4
	printf("%d\n", sizeof(&p + 1));      //表示 存放指针p地址的后一个地址的大小 4
	printf("%d\n", sizeof(&p[0] + 1));   //表示 元素b地址的大小 4
	printf("%d\n", strlen(p));           //表示的是 字符串的大小 6
	printf("%d\n", strlen(p + 1));       //表示的是 剩余字符串的大小,传的b的地址,5
	//printf("%d\n", strlen(*p));          //格式错误, 传的字符
	//printf("%d\n", strlen(p[0]));        //格式错误, 原因同上
	printf("%d\n", strlen(&p));          //表示的是 从p的地址处开始 到\0的长度 随机值
	printf("%d\n", strlen(&p + 1));      //表示的是 从p的地址的下一个地址开始,到\0的长度, 随机值
	printf("%d\n", strlen(&p[0] + 1));   //表示的是 剩余字符串的长度,传的b的地址 5

    return 0;
}


        我是专注学习的章鱼哥~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值