strlen和sizeof

在 C 语言中,strlensizeof 是两个非常常用的操作符,但它们的作用和用途有很大的不同。下面详细解释这两个操作符:

strlen

strlen 是一个函数,定义在 <string.h> 头文件中,用于计算一个以空字符('\0')结尾的字符串的长度。它不包括最后的空字符。

函数原型:

size_t strlen(const char *str);
  • 参数str 是指向字符数组(字符串)的指针。
  • 返回值:返回字符串的长度,即字符串中字符的数量,不包括最后的空字符。

示例

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    //%zu用于打印 size_t 类型的变量
    printf("Length of str: %zu\n", strlen(str));  // 输出 13
    return 0;
}

sizeof

sizeof 是一个编译时运算符,用于获取数据类型或变量在内存中所占的字节数。

  • 使用方式:可以直接跟在变量或类型名前使用。
  • 返回值:返回类型或变量的大小,单位是字节。

示例

#include <stdio.h>

int main() {
    char c = 'A';
    int i = 10;
    double d = 3.14;

    printf("Size of char: %zu bytes\n", sizeof(c));  // 输出可能是 1
    printf("Size of int: %zu bytes\n", sizeof(i));   // 输出可能是 4
    printf("Size of double: %zu bytes\n", sizeof(d)); // 输出可能是 8

    char str[] = "Hello";
    printf("Size of str: %zu bytes\n", sizeof(str)); // 输出是字符串的总字节数,包括'\0'
    return 0;
}

补充:sizeof不能重载

sizeof是运算符而不是函数可以从它的使用规则来看,sizeof无需使用sizeof(),而可以直接使用sizeof在后面加数据类型。

#include<stdio.h>
int main()
{   
    int a = 4;
    const char *str1 = "hello World";
    char str2[] = "hello World";
    printf("%ld\n",sizeof a);
    //这里str1是指向字符串的指针,而不是字符串
    printf("%ld\n",sizeof str1);

    printf("%ld\n",sizeof 4);
    //sizeof会计算字符串结束符
    printf("%ld\n",sizeof str2);
    return 0;
}

在这里插入图片描述

sizeof与数组

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}

在这里插入图片描述
解释
数组名的含义
数组名一般为数组首元素地址,但有两个例外

1:sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
2:&数组名,数组名表示整个数组,取出的是整个数组的地址

1.数组名单独放在sizeof内部,计算整个数组的大小(4*4=162.数组名没有单独放在sizeof内部,此时数组名为首元素地址,a+0还是数组首元素地址,地址大小为8字节

3.对数组首元素地址解引用,得到的是数组首元素,数组首元素类型为int,大小为4字节

4.a+1为数组首元素地址+1,地址大小为8字节

5.a[1]计算第二个元素大小,由于该元素类型为int,所以结果为4字节

6.&a取出的为整个数组的地址,但数组的地址也是地址,地址大小不会改变(不会因为是数组地址就变大或是char类型的变量就变小),大小就是8字节

7.1.*&相互抵消sizeof*&a)==sizeof(a),计算的为整个数组的大小

   (2.&a先取出整个数组的地址

              而*(解引用操作符)到底访问多少由指针类型决定,此时指针的类型为int*[4],故访问整个数组

8.*&a访问的是整个数,此时&a+1计算的是a数组后面的那个地址,地址大小为8字节

9.数组首元素地址,大小8

10.数组第二个元素的地址,大小8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值