strlen与sizeof

1、sizeof ,strlen

#include<stdio.h> 
int i;
int main(int argc, char *argv[])
{
	i--;
	printf("%d %x\n",sizeof(i),i);
	if (i > sizeof(i))
	{
	printf(">\n");
	}
	else
	{
	printf("<\n");
	}
	return 0;
}

答案是’>’;
1、sizeof:获取数据在内存中的存储空间,以字节为单位计数。
3、sizeof返回的size_t是无符号的,负数在机器内存储位补码形式
2、>号自右向左结合,符号两边的类型统一为sizeof(i)的无符号类型,因此-1被转换为非常大的无符号数。

#include<stdio.h> 
#include<string.h>
int main(int argc, char *argv[])
{
	char str[] = "Welcome to Xiyou";
	printf("%u %u\n", strlen(str), sizeof(str));
	return 0;
}

答案是16,17;
1、strlen(str)求的是字符串长度 ;
sizeof(str)求的是所占空间大小,单个字符是1字节,结束符虽然不显示但是存的有 ;
2、  在字符串中加入’\0’,sizeof会加一,’\0’也是字符;
3、strlen是函数,引用时需要头文件,sizeof是运算符;

用代码实现strlen函数

1、通过指针访问字符串,计数器读取字符串长度
我们知道C语言的字符串结尾为’\0’,所以我们可以通过判断我们当前所访问的地址所对的字符是不是’\0’,如果是则停下,反之则计数器加一,地址向后移动一位判断下一个字符是否符合条件。
ps:char类型的指针大小为1,指针加法可以实现对访问地址的移动。

#include <stdio.h>
int my_strlen(char*a) 
{
	int i,count=0;
	while(*a!='\0')
	{
	    count++;
		a++;	
	}
	return count;
}
int main()
{
	char a[]="i am a student !";
	int t;
	t=my_strlen(a);
	printf("%d",t);
    return 0;
}

2、迭代法

#include <stdio.h>
int my_strlen(char*a) 
{
	if(*a=='\0')
	    return 0;
	else
	    return 1+my_strlen(a+1);
}
int main()
{
	char a[]="i am a student !";
	int t;
	t=my_strlen(a);
	printf("%d",t);
    return 0;
}

迭代思想,递归方法;``
输出16;

sizeof

#include <stdio.h>
int main()
{
	int i=0;
	int *a=NULL;
	char *b=NULL;
	int c[100];
	printf("%d %d\n",sizeof(int),sizeof(i));
	printf("%d %d %d %d\n",sizeof(a),sizeof(*a),sizeof(b),sizeof(*b));
	printf("%d %d %d\n",sizeof(c),sizeof(c[0]),sizeof(c[100]));
	printf("%d %d %d\n",sizeof(&c),sizeof(&c[0]),sizeof(&c[100]));
	printf("%d %d %d\n",sizeof(&c+1),sizeof(&c[0]+1),sizeof(&c[100]+1));
    return 0;
} 

输出结果为:
4 4
4 4 4 1
400 4 4
4 4 4
4 4 4

带上*,是指向的变量的类型的大小,而指针无论为何种类型,他的值都为4

void fun(int a[100])
{
	printf("%d",sizeof(a));
} 
int main()
{
	int b[100];
	fun(b);
	return 0;
}

数组名在函数中退化的问题,即在函数中作为形参退化为一个指针,故求出来的大小为4;

char*a[]={"china","french","america","german"}
sizeof(a)=16;

[ ]的优先级高于*,数组中的元素才是char*。

(以上叙述有什么错误请大神指正(●’◡’●))

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值