c 数组作为函数参数并结合sizeof使用分析

本文详细解析了C语言中函数的三种传参方式:按值、按指针、按引用,以及sizeof和strlen的区别。通过实例展示了数组、指针和字符串在不同情况下的大小计算,帮助读者深入理解C语言的底层机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先函数的传参方式只有三种 : 按值传参, 按指针传参,按引用传参。

另外介绍一下sizeof 和 strlen的区别

1.sizeof  是运算符, 在编译时确定大小 。strlen是函数 ,在运行时确定大小。

2.sizeof可以用变量, 类型(如 int, char),函数( 如func() ) 做参数,strlen只能用char*做参数,且必须是以''\0''结尾的,否则就会溢出报错了。
3.数组做sizeof的参数不会退化(比如int arr[100]; sizeof(arr) = 100 * sizeof(int) = 400 ),而传给strlen的函数会退化成char * 指针。

#include <stdio.h>

#define _sizeof(T) ( (size_t)((T*)0 + 1))  // 变量 
#define array_sizeof(T)   ( (size_t)(&T+1)  - (size_t)(&T)  ) //数组

int main()
{
   int a[100];
   int b[10];

   char *str="1234567890";
   printf("%d\n", sizeof(str)); // str指针 相当于计算 sizeof(char *) = 4
   printf("%d\n", sizeof(*str)); // str[0] = 1

   char s[100]="1234567890";
   printf("%d\n", sizeof(&s)); // sizeof(char *) = 4
   printf("%d\n", sizeof(s)); // sizeof(char)*100 = 100
   printf("%d\n", sizeof(*s)); // sizeof(s[0]) = sizeof(char) = 1
   return(0);
}


 

第一种不介绍了。

第二,三种

#include <stdio.h>
#define _sizeof(T) ( (size_t)((T*)0 + 1))  // 变量
#define array_sizeof(T)   ( (size_t)(&T+1)  - (size_t)(&T)  ) //数组
void test(short int arr[33]) //指针传参 指针 无所谓后面的大小  也可以写成 int *arr
{
    printf("%d\n", sizeof(arr)); //相当于sizeof(int *)
    printf("%d\n", sizeof(*arr)); //相当于arr[0]
}

void test1(int (*arr)[100]) //指针传参 指向类型为int 大小100的数组 所以必须要匹配100
{
    printf("%d\n", sizeof(arr)); //输出int 指针(int *)的大小   = 4
    printf("%d\n", sizeof(*arr)); //输出 *arr指向的100个int类型的数组的首地址,计算整个数据的大小 =400
}

void test2(short int (&arr)[10]) //引用传参
{
    printf("%d\n", sizeof(arr)); //计算整个数组的大小
    printf("%d\n", sizeof(*arr)); //arr[0] 的大小
}

int main()
{
   int a[100];
   short int b[10]; 
   test(b);
   test1(&a);
   test2(b);
   //printf("%d\n",  sizeof('aabcbacc')); 
   return(0);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值