C语言:关于sizeof返回值的理解

我学指针的时候发现,64位编译会出现如下情况,(当时百思不得其解,通过百度,问大佬总结以下几点):

在这里插入图片描述
1.运算符 sizeof 的返回值是 unsigned 类型,x 是 int 类型,比较时会将 x 升级为 unsigned 类型,而 -1 变为 unsigned 类型是一个很大的整数。

2、sizeof操作符能够得到一个结构的整体长度,包括因边界对齐而跳过的那些字节。

3、sizeof 和 strlen 的区别:

sizeof 是操作符,而 strlen 是库函数,sizeof 的参数可以是数据的类型,也可以是变量,而 strlen 只能以结尾为 \0 的字符串作为参数;

编译器在编译时就计算出了 sizeof 的结果。而 strlen 函数必须在运行时才能计算出来。并且 sizeof 计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度。

重点:

  • sizeof()运算符的值的类型是size_t而不是int,所以用于int的%d不适合。如果您用的是C99,您需要:#include <inttypes.h>
    或者#include <stdint.h>
    然后在printf里用%zu作为size_t的格式。

  • 32位的编译器 size_t 是 unsigned int,64位的编译器则是 unsigned long long
    32位可以用%d 或 %u,64位可以用%lld 或 %llu

例子:

#define _CRT_SECURE_NO_WARNINGS

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

#pragma warning(disable:6031)

int main(void) {
	int a = 10;
	a = 20;
	int b = 100;
	//指针是一种数据类型 p是指针类型变量 用来指向一个变量的地址
	int* p = &a;
	p = &b;
	printf("%p\n", &b);
	printf("%X\n", p);
	/*printf("%p\n", p);*/

	//通过指针修改变量值
	*p = 200;
	printf("%d\n", b);
	printf("%d\n", *p);

	//sizeof() 指针类型在内存的大小 正在64位操作系统中是8个字节大小

	printf("%zu\n", sizeof(p));
	printf("%zu\n", sizeof(int*));
	printf("%zu\n", sizeof(char*));
	printf("%zu\n", sizeof(short*));
	printf("%zu\n", sizeof(long*));
	printf("%zu\n", sizeof(float*));
	printf("%zu\n", sizeof(double*));

	system("pause");
	return EXIT_SUCCESS;
}

发布了28 篇原创文章 · 获赞 7 · 访问量 1192

猜你喜欢

转载自blog.csdn.net/haduwi/article/details/105065979