您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-24 14:19 281 查看

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(2^32),这个数是表示的最大的字节数,即size_t表示的对象的最大的大小为2^32个字节(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 = #//这里可能会提示imcompatble,因为intptr_t与指针的长度相同,所以可以忽略
uintptr_t* pu = (uintptr_t*)#//注意如果此处不加强制类型转换
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 指针 size-t 内存