指针和数组相关运算

我们常用的 sizeof 不是函数,它是以字节为单位来计算不同类型的变量或数组大小的操作符; strlen 是函数,他的参数是 char * 类型的指针,它以 ‘\0’为结束标志求取 char * 类型的指针指向的对象到 ‘\0’ 之间元素所占的字节数。理解这些题目分析清楚“()“里面的内容代表的含义是关键。当我们理解二维数组时大胆的将它理解成一维数组 例如二维数组:int = a[3][4] = {0};可理解为 int a[] = {a[0],a[1],a[2]};只是这里一维数组的每个元素占 16 个字节,其他的完全可以按一维数组的理解方式去理解。这里我们不得不说说数组和指针的关系,虽然在某些情况下使用很类似,但他们二者的关系是没有关系,哈哈哈。以下题目的用算结果已做了验证。
//一维数组
	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+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'};
	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));      //随机数 假设19
	printf("%d\n",strlen(arr+0));    //19
	printf("%d\n",strlen(*arr));     //error
	printf("%d\n",strlen(arr[1]));   //error
	printf("%d\n",strlen(&arr));     //19
	printf("%d\n",strlen(&arr+1));   //13
	printf("%d\n",strlen(&arr[0]+1));//18

	char *p = "abcdef";
	printf("%d\n",sizeof(p));      //4
	printf("%d\n",sizeof(p+1));    //4
	printf("%d\n",sizeof(*p));     //1
	printf("%d\n",sizeof(p[0]));   //1
	printf("%d\n",sizeof(&p));     //4
	printf("%d\n",sizeof(&p+1));   //4
	printf("%d\n",sizeof(&p[0]+1));//4

	printf("%d\n",strlen(p));      //6
	printf("%d\n",strlen(p+1));    //5
	printf("%d\n",strlen(*p));     //error
	printf("%d\n",strlen(p[0]));   //error
	printf("%d\n",strlen(&p));     //随机数
	printf("%d\n",strlen(&p+1));   //随机数
	printf("%d\n",strlen(&p[0]+1));//5

	//二维数组
	int a[3][4] = {0};             //a[3][4] = {a[0],a[1],a[2]};
	printf("%d\n",sizeof(a));      //48
	printf("%d\n",sizeof(a+1));    //4
	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));     //16
	printf("%d\n",sizeof(a[3]));   //16
注:只有两种情况下数组名代表整个数组:(1) sizeof(数组名),这里的数组名代表整个数组 (2) &数组名,这里的数组名代表整个数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值