C语言学习笔记——strlen与sizeof的使用注意事项

在分享笔记之前,先简单介绍一下strlen与sizeof的基本使用

注意:strlen 是函数,sizeof 是运算操作符

1、strlen()函数

作用是用于计算字符串的长度,碰到字符 ' \0 ' 会停止计算(不包括\0)

函数原型

size_t strlen(const char *str);

参数:str -- 要计算长度的字符串

返回值:该函数返回字符串的长度,注意是size_t类型(无符号整形 unsigned int)

#ifdef _WIN64
    typedef unsigned __int64 size_t;
    typedef __int64          ptrdiff_t;
    typedef __int64          intptr_t;

        此为vs编译器的头文件中unsigned int的重命名

函数示例

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello world";
	int len = strlen(str);
	printf("长度是:%d\n",len);//长度是:11
	return 0;
}

2、sizeof()操作符

功能是返回一个变量或者类型的大小(以字节为单位),通俗一点说sizeof就是用于判断变量或者类型字节的大小。

操作符原型

sizeof(type);

参数:type 是要计算大小的数据类型,包括类、结构、共用体和其他用户自定义数据类型

操作示例

#include<stdio.h>
int main()
{
	printf("%d\n", sizeof(int));//4
	printf("%d\n", sizeof(char));//1
	printf("%d\n", sizeof(float));//4
	printf("%d\n", sizeof(double));//8
	printf("%d\n", sizeof(long int));//4
	//注意:是以字节为单位
}

以上则是strlen与sizeof的基本讲解,下面则是使用笔记

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//整形数组
//int main()
//{
//	//数组名是首元素的地址(两个特殊除外)
//	//1、sizeof(数组名) - 数组名表示整个数组
//	//2、&数组名 - 数组名表示整个数组
//	int a[] = { 1,2,3,4 };
//	printf("%d\n", sizeof(a)); //16 sizeof(数组名) - 计算的是数组总大小 - 单位是字节
//	printf("%d\n", sizeof(a+0)); //8 - 数组名这里表示首元素的地址 a+0不变还是首元素的地址,地址大小就是4/8个字节
//	printf("%d\n", sizeof(*a)); //4 - 数组名表示首元素的大小,*a解引用表示的是首元素,计算的是第一个元素int类型
//	printf("%d\n", sizeof(a+1)); //8 - 数组名这里表示首元素的地址,a+1表示第二个元素的地址
//	printf("%d\n", sizeof(a[1])); //4 - 第二个元素的大小
//	printf("%d\n", sizeof(&a)); //8 - &a取出的是数组的地址,地址的大小就是4或8个字节
//	printf("%d\n", sizeof(*&a)); //16 - &a取出数组的地址,然后*解引用访问整个数组
//	printf("%d\n", sizeof(&a+1)); //8 - &a是数组的地址,&a+1虽然跳过整个数组,但还是地址
//	printf("%d\n", sizeof(&a[0])); //8 - 第一个元素的地址
//	printf("%d\n", sizeof(&a[0]+1)); //8 - 第二个元素的地址
//	return 0;
//}

#include<string.h>
//字符数组
//int main()
//{
//	//数组名是首元素的地址(两个特殊除外)
//	//1、sizeof(数组名) - 数组名表示整个数组
//	//2、&数组名 - 数组名表示整个数组
//	//char arr[] = { 'a','b','c','d','e','f' };
//	//printf("%d\n", sizeof(arr)); //6 sizeof计算的是数组的大小 6*1(char类型的大小为1字节)
//	//printf("%d\n", sizeof(arr + 0)); //8 arr是首元素的大小 arr+0还是首元素的地址
//	//printf("%d\n", sizeof(*arr)); //1 arr是首元素的大小,通过*解引用的得到数组第一个元素
//	//printf("%d\n", sizeof(arr[1])); //1
//	//printf("%d\n", sizeof(&arr)); //8 &arr是数组的地址,数组的地址还是地址,所以是4或8
//	//printf("%d\n", sizeof(&arr + 1)); //8 &arr是数组的地址 &arr+1是跳过整个数组后的地址
//	//printf("%d\n", sizeof(&arr[0] + 1)); //8 第一个元素的地址,加1之后是第二个元素的地址
//
//	//strlen
//	//strlen 函数用来求字符串的长度(包含多少个字符)
//	//从字符串的开头位置依次向后计数,直到遇见\0
//
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", strlen(arr)); //随机值,因为strlen函数碰到 \0 停止查找,此数组没有\0
//	printf("%d\n", strlen(arr + 0)); //随机值
//	//printf("%d\n", strlen(*arr)); //非法访问 err strlen函数要的是地址,*解引用之后传的是元素值
//	//printf("%d\n", strlen(arr[1])); //非法访问 err
//	printf("%d\n", strlen(&arr)); //随机值
//	printf("%d\n", strlen(&arr + 1)); //随机数
//	printf("%d\n", strlen(&arr[0] + 1));//随机数
//	return 0;
//}

//int main()
//{
//	//数组名是首元素的地址(两个特殊除外)
//	//1、sizeof(数组名) - 数组名表示整个数组
//	//2、&数组名 - 数组名表示整个数组
//
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", sizeof(arr)); //6 sizeof计算的是数组的大小
//	printf("%d\n", sizeof(arr + 0)); //8 计算的是地址的大小 arr+0还是首元素的地址
//	printf("%d\n", sizeof(*arr)); //1 计算的是第一个元素的大小 *解引用得到第一个元素
//	printf("%d\n", sizeof(arr[1])); //1 计算的是第二个元素的大小
//	printf("%d\n", sizeof(&arr)); //8 &arr取出的是数组的地址,地址是4/8个字节
//	printf("%d\n", sizeof(&arr + 1)); //8 &arr+1是跳过整个数组之后的地址
//	printf("%d\n", sizeof(&arr[0] + 1)); //8 取出第一个元素的地址+1,相当于是第二个元素的地址
//	return 0;
//}

//int main()
//{
//	char *p = "abcdef";
//	printf("%d\n", strlen(p)); //6
//	printf("%d\n", strlen(p + 1)); //5
//	//printf("%d\n", strlen(*p)); //非法访问err 因为strlen只接受地址
//	//printf("%d\n", strlen(p[0])); //非法访问err
//	printf("%d\n", strlen(&p)); //随机值
//	printf("%d\n", strlen(&p + 1)); //随机值
//	printf("%d\n", strlen(&p[0] + 1)); //5
//
//	//printf("%d\n", sizeof(p)); //8 计算的指针变量p的大小
//	//printf("%d\n", sizeof(p + 1)); //8 字符指针b的地址
//	//printf("%d\n", sizeof(*p)); //1 *p解引用,就是字符串的第一个字符
//	//printf("%d\n", sizeof(p[0])); //1 p[0]等价于*(p+0)
//	//printf("%d\n", sizeof(&p)); //8
//	//printf("%d\n", sizeof(&p + 1)); //8
//	//printf("%d\n", sizeof(&p[0] + 1)); //8
//
//	//char arr[] = "abcdef";
//	//printf("%d\n", strlen(arr)); //6
//	//printf("%d\n", strlen(arr + 0)); //6
//	printf("%d\n", strlen(*arr)); //非法访问 err
//	printf("%d\n", strlen(arr[1])); //非法访问 err
//	//printf("%d\n", strlen(&arr)); //6
//	//printf("%d\n", strlen(&arr + 1)); //随机值
//	//printf("%d\n", strlen(&arr[0] + 1)); //5
//	return 0;
//}

//二维数组
//int main()
//{
//	//数组名是首元素的地址(两个特殊除外)
//	//1、sizeof(数组名) - 数组名表示整个数组
//	//2、&数组名 - 数组名表示整个数组
//
//	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 a[0]相当于第一行作为一维数组的数组名,sizeof(arr[0])把数组名单独防止sizeof方括号内部,计算的是第一行的大小
//	printf("%d\n", sizeof(a[0]+1)); //8 a[0]相当于第一行的数组名,数组名此时是首元素的地址,其实就是第一行的第一个地址
//	//所以a[0]+1就是第一行第二个元素的地址,地址大小是4或8个字节
//	printf("%d\n", sizeof(*(a[0] + 1))); //4
//	printf("%d\n", sizeof(a+1)); //8 a是二维数组的数组名,没有sizeof(数组名),也没有&数组名,所以a是首元素的地址
//	//而二维数组的首元素是第一个(整行),把二维数组看出一维数组
//	printf("%d\n", sizeof(*(a + 1))); //16
//	printf("%d\n", sizeof(&a[0] + 1)); //8 第二行的地址,注意&这个符号
//	printf("%d\n", sizeof(*(&a[0] + 1))); //16
//	printf("%d\n", sizeof(*a)); //16
//	printf("%d\n", sizeof(a[3])); //16 
//	return 0;
//}

以上代码均在vs2022环境下编译

猜你喜欢

转载自blog.csdn.net/qq_72935001/article/details/126167296
今日推荐