C语言:sizeof和strlen的区别

简介: 1.指针在32位平台和64位平台的大小是不同的,32位下是4字节,64位下是8字节

一、基础知识



1.指针在32位平台和64位平台的大小是不同的,32位下是4字节,64位下是8字节

2.*a == *(a+0) == a[0]这个🦁式子要牢记~

3.只要是地址,那么大小就是4或者8


strlen


1.是一种函数。

2.’\0’作为终止符;

3.strlen的结果运行的时候才出来(不是编译期求值),是计算字符串长度的。

4.其参数必须是字符型指针(char*)。就是传进来的必须是char*的地址

5.需要引用头文件为#include<string.h>


sizeof


1.是一种c中的基本运算符。

2.可以以类型、指针、数组和函数等作为参数。

3.返回值类型为unsigned int

4.运算值在编译的时候就出结果,所以可以用来定义数组维数。

5.sizeof()是一种单目操作符,是用来计算你所使用的操作数所占的空间字节大小。


二、练习


int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));
//答案:4*4=16
//数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小,
printf("%d\n",sizeof(*&a));
//答案:16
//因为&a取出的是整个数组的地址,对整个数组的地址解引用,得到的就是数组的大小//本质上和第一个一样哦↑👆
printf("%d\n",sizeof(a+0));
//答案:4或者8
//此时a就表示首元素的地址了,因为a不是单独放在sizeof内部了
printf("%d\n",sizeof(*a));
//答案:4
//此时a为首元素地址,*a就是得到第一个数组元素,相当于a[0],一个整型的大小就是4
printf("%d\n",sizeof(a+1));
//答案:4或者8
//因为此时a为首元素地址,a+1代表第二个元素的地址
printf("%d\n",sizeof(a[1]));
//答案:4
//因为a[1]代表的是第二个元素
printf("%d\n",sizeof(&a));
//答案:4或者8
//因为&a取出的是整个数组的地址,而只要是地址,那么大小就是4或者8
printf("%d\n",sizeof(&a+1));
//答案:4或者8
//&a+1得到的是a这个数组之后的,跳过整个数组a的地址,但本质仍然是地址
printf("%d\n",sizeof(&a[0]));
//答案:4或者8
//因为得到的是a[0]这个元素的地址
printf("%d\n",sizeof(&a[0]+1));
//答案:4或者8
//得到的是第二个元素的地址
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
//答案:6
//sizeof里面单独放数组名,得到的是整个数组的大小,六个元素,每个元素是1个字节
printf("%d\n", sizeof(arr+0));
//答案:4或者8
//得到的是第一个元素的地址
printf("%d\n", sizeof(*arr));
//答案:1
//访问了‘a’,而a是一个字节
printf("%d\n", sizeof(arr[1]));
//答案:1
//访问了‘a’,而a是一个字节
printf("%d\n", sizeof(&arr));
//答案:4或者8
//取出整个数组的地址
printf("%d\n", sizeof(&arr+1));
//答案:4或者8
//跳过整个数组,但仍然是地址
printf("%d\n", sizeof(&arr[0]+1));
//答案:4或者8
//得到了第二个元素的地址
printf("%d\n", strlen(arr));
//答案:未知数
//因为结尾没有'\0'
printf("%d\n", strlen(arr+0));
//答案:未知数
//因为结尾没有'\0'
printf("%d\n", strlen(*arr));
//答案:非法访问内存,编译会出错
//因为strlen以为传进来的‘a’的ascll码值是一个地址
printf("%d\n", strlen(arr[1]));
//答案:非法访问内存,编译会出错
//因为strlen以为传进来的‘b’的ascll码值是一个地址
printf("%d\n", strlen(&arr));
//答案:未知数
//&arr得到的是数组的地址,由于结尾没有'\0',仍然为随机值
printf("%d\n", strlen(&arr+1));
//答案:随机值
//由于结尾没有'\0'
printf("%d\n", strlen(&arr[0]+1));
//答案:随机值
//由于结尾没有'\0'
相关文章
|
6月前
|
C语言
【C语言】指针进阶之sizeof和strlen函数的对比
【C语言】指针进阶之sizeof和strlen函数的对比
|
5月前
|
C语言
C 语言关于sizeof() 和 strlen()区别?
C 语言关于sizeof() 和 strlen()区别?
35 2
|
5月前
|
C语言
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
C语言学习记录——模拟字符串相关函数(strcpy、strlen、strcat)相关知识-const、typedef
30 1
|
6月前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
58 0
|
6月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
C语言
【C语言】sizeof和strlen的区别【详解】
【C语言】sizeof和strlen的区别【详解】
178 0
|
编译器 C语言
C语言中的sizeof与strlen
sizeof和strlen函数基本在所有公司的嵌入式软件笔试题中都会出现。反正我是遇到了好几次。虽然很多人都会用,但是又很经常会出错,这是因为很多人没有好好的去总结。好了,废话不多说,进入今天的主题。
|
编译器 C语言
【C语言】strlen函数的讲解和模拟实现
strlen函数我们应该不陌生,它可以帮助我们求字符串的长度(不包括’\0’),但里面还有一些细节需要我们注意。
|
C语言
C语言语言:探究sizeof和strlen的区别
C语言语言:探究sizeof和strlen的区别
148 0
|
Serverless C语言