c语言中哪些类型打大小分平台,C语言指针的长度和类型深入分析

指针是C语言的精髓,本文就以实例的形式详细分析了C语言的长度和类型。对于初学者深入理解C语言程序设计有很好的参考价值。具体分析如下:

一般来说,如果考虑应用程序的兼容性和可移植性,指针的长度就是一个问题,在大部分现代平台上,数据指针的长度通常是一样的,与指针类型无关,尽管C标准没有规定所有类型指针的长度相同,但是通常实际情况就是这样。但是函数指针长度可能与数据指针的长度不同。

指针的长度取决于使用的机器和编译器,例如:在现代windows上,指针是32位或是64位长

测试代码如下:

#include

#include

#include

#include

struct p{

int n;

float f;

};

int main()

{

struct p *sptr;

printf("sizeof *char: %d\n", sizeof(char*));

printf("sizeof *int: %d\n", sizeof(int*));

printf("sizeof *float: %d\n", sizeof(float*));

printf("sizeof *double: %d\n", sizeof(double*));

printf("sizeof *struct: %d\n", sizeof(sptr));

return 0;

}

运行结果如下图所示:

a24c4470607bee23167a1b1e5c8c506b.png

指针相关的预定义类型:

① size_t:用于安全地表示长度② ptrdiff_t:用于处理指针算术运算③ intptr_t:用于存储指针地址④ uintptr_t:用于存储指针地址

分述如下:

一、size_t类型

size_t 类型是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。 C语言中,此类型位于头文件stddef.h中。它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小,它的目的是提供一种可移植的方法来声明与系统中可寻址的内存区域一致的长度:

因为C/C++标准只定义一最低的位数,而不是必需的固定位数。而且在内存里,对数的高位对齐存储还是低位对齐存储各系统都不一样。为了提高代码的可移植性,就有必要定义这样的数据类型。一般这种类型都会定义到它具体占几位内存等。当然,有些是编译器或系统已经给定义好的。经测试发现,在32位系统中size_t是4字节的,而在64位系统中,size_t是8字节的,这样利用该类型可以增强程序的可移植性。

size_t类型用作sizeof操作符的返回类型,同时也是很多函数的参数类型,包括malloc和strlen

在声明例如字符数、或者数组索引这样的长度变量时用size_t是好的做法,它经常用于循环计数器、数组索引,有时候还用在指针算术运算上

打印size_t类型的值要小心,这是无符号值,如果选错格式说明符,可能会得到不可靠的结果,推荐的格式说明符是%zu,在某些情况下可以考虑用%u或%lu替代

二、ptrdiff_t类型

ptrdiff_t是C99标准库中定义的一个与机器相关的数据类型,定义在stddef.h这个文件内。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。

ptrdiff_t通常被定义为long int类型,size_t 是unsigned 类型,而 ptrdiff_t 则是 signed 整型。

这两种类型的差别体现了它们各自的用途:size_t 类型用于指明数组长度,它必须是一个正数;ptrdiff_t 类型则应保证足以存放同一数组中两个指针之间的差距,它有可能是负数。

#include

#include

#include

int main(void)

{

char str[] = "Hello world!";

char *pstart = str;

char *pend = str + strlen(str);

ptrdiff_t difp = pend - pstart;

printf("%d\n", difp);

return 0;

}

三、intptr_t与uintptr_t类型

intptr_t与uintptr_t类型用来存放指针地址,它们提供了一种可移植且安全的方法声明指针,而且与系统中使用的指针的长度相同,对于把指针转化为整数形式很有用。uintptr_t是intptr_t的无符号版本

关于intptr_t的类型定义如下:

/* Types for `void *' pointers. */

#if __WORDSIZE == 64

# ifndef __intptr_t_defined

typedef long int intptr_t;

# define __intptr_t_defined

# endif

typedef unsigned long int uintptr_t;

#else

# ifndef __intptr_t_defined

typedef int intptr_t;

# define __intptr_t_defined

# endif

typedef unsigned int uintptr_t;

#endif

从定义可以看出,intptr_t在不同的平台是不一样的,始终与地址位数相同,因此用来存放地址。

概念上, 尽管地址是指针, 内存管理常常使用一个无符号的整数类型更好地完成; 内核对待物理内存如同一个大数组, 并且内存地址只是一个数组索引. 进一步地, 一个指针容易解引用; 当直接处理内存存取时, 你几乎从不想以这种方式解引用. 使用一个整数类型避免了这种解引用, 因此避免了 bug. 因此, 内核中通常的内存地址常常是 unsigned long, 利用了指针和长整型一直是相同大小的这个事实, 至少在 Linux 目前支持的所有平台上.C99 标准定义了 intptr_t 和 uintptr_t 类型给一个可以持有一个指针值的整型变量

测试代码:

#include

#include

#include

#include

#include

#include

#define ID_STR_LEN 12

#define NAME_STR_LEN 10

typedef struct student

{

char id[ID_STR_LEN];

char name[NAME_STR_LEN];

uint8_t age;

}student;

student * create_student()

{

student *stu = (student *)malloc(sizeof(student));

if (stu == NULL)

return NULL;

memset(stu, 0, sizeof(student));

return stu;

}

void *free_student(student *stu)

{

if (stu)

free(stu);

return 0;

}

static void init_student(student * stu)

{

assert(stu);

const char *id = "2013112210";

const char *name = "Anker";

uint8_t age = 21;

memcpy(stu->id, id, strlen(id));

memcpy(stu->name, name, strlen(name));

stu->age = age;

}

static int handle_student(intptr_t handle)

{

if (handle == 0)

{

return -1;

}

student *stu = (student*)handle;

printf("id: %s\n", stu->id);

printf("name: %s\n", stu->name);

printf("age: %u\n", stu->age);

return 0;

}

int main(void)

{

student *stu;

stu = create_student();

init_student(stu);

//将指针转换为intptr_t类型

intptr_t handle = (intptr_t)stu;

handle_student(handle);

free_student(stu);

return 0;

}

希望本文所述实例对大家C程序设计的学习有所帮助。

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值