深入理解C指针学习笔记(三)

1.2指针的长度和类型

指针的长度对于应用程序的兼容性和可移植性是一个问题。在同一平台上,不同数据类型的指针的长度是相同的,与指针的类型无关,例如char*和struct*的大小是相同的。但是函数指针和数据只针对的大小不同
指针长度取决于使用机器和编译器。比如在windows上,指针的长度是32位或者64位,但是在Dos操作系统中,指针的长度是16位或者32位长。

1.2.1与指针相关的预定义类型

  • Size_t 用于安全的表示长度
  • ptrdiff_t 用于处理指针算术运算
  • intptr_和uintptr_t 用于存储指针地址

1.size_t

size_t类型表示C中任何对象所能达到的最大长度。它是无符号整数,因为负数在这里没意义。它提供了一种可移植的方法,即使系统中对不同数据类型分配的内存不同,也可以从size_t得到。size_t是操作符sizeof()的返回值类型,同时也是很多函数的返回值类型,例如malloc和strlen.

理解size_t类型是表示C中任何对象所能达到的最大长度。
size_t的实际含义是对象所占的字节的个数(假定在32位的机器中)。size_t实际类型是unsigned int,所以它的最大值是65535(232),这个数是表示的最大的字节数,即size_t表示的对象的最大的大小为232个字节(Bytes),此时最大的对象的大小为2^32Bytes,换算成GB即为4GB,刚好是计算机内存的最大大小。所以说size_t类型表示C中任何对象所能达到的最大长度。

size_t的用途:
在生命字符数或者数组索引这样的变量时用size_t是很好的做法,它常用于循环计数器、数组索引,有时候还应用在指针的算术运算上。
size_t的声明

//他在stdio.h和stdlib.h中均有定义
#ifndef __SIZE_T
#define __SIZE_T
typedef unsigned  int size_t;
#endif

打印size_t类型值
在打印size_t类型的值得时候,注意size_t是unsigned int 类型,而不是int类型,所以在打印的时候使用的格式化字符位**%zu**,例:

	size_t t = -5;//若是t正数则正常显示
	printf("%d\n", t); //打印结果-5
	printf("zu\n", t);//32位机器上打印结果为4294967291,64位机器上的打印结果位18446744073709551611

###2. 对指针使用sizeof()操作符
sizeof操作符可以用来判断指针的长度。如下:

//输出结果为8(64位机器),其他平台输出结果可能是4
printf("size of *char: %zu\n", sizeof(char*));

由上面可以看出不同平台指针的长度可能不同,所以当要使用指针的长度的时候要一定使用sizeof操作符.

3.使用intptr_t和uintptr_t

intptr_t和uintptr_t两个类型实在< stdint.h>库中定义的,其中uintptr_t是intptr_t的一种无符号形式。他们用来存放指针地址。Cpluspluc.com对它们 的定义是:

Integer type capable of holding a value converted from a void pointer and then be converted back to that type with a value that compares equal to the original pointer.Optional: These typedefs may not be defined in some library implementations.
意思也就是说它们的长度和系统中的指针长度相同,我们可以把地址存在这两种数据类型中,而不会丢失地址的精度。到使用地址的时候我们还可以把它们转化为原来的地址。优点:长度与系统指针位数相同,不会丢失精度,使用int可能会产生地址的精度丢失

一般情况下我们使用intptr_t但不使用uintptr_t,使用方法:

int num = 10;
intptr_t* pi = &num;//这里可能会提示imcompatble,因为intptr_t与指针的长度相同,所以可以忽略
uintptr_t* pu = (uintptr_t*)&num;//注意如果此处不加强制类型转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值