该系列文章源于《深入理解C指针》的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教。
如果考虑到程序的可移植性和跨平台性时,指针长度就是一个问题,需要慎重处理。一般情况下,数据指针的长度时一样的,与指针类型无关,void型指针、char型指针、结构体指针等统统是一样的,函数指针的长度一般与数据指针长度不同。指针长度与CPU有关,严格意义上说与OS究竟是32位还是64位有关,同时不同的编译器分配内存时,长度也是不一样的。与指针相关的四种预定义类型如下:
一、size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度
1、定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数;常常定义在stdio.h或stdlib.h中
2、特征:
1)、提供一种可移植的方式来声明与系统中可寻址的内存区域一致的长度
2)、用作sizeof操作符的返回值的类型
3)、用作内存相关函数malloc()和strlen()的参数类型
4)、常用来声明字符个数、循环计数、数组索引的长度
5)、可以用在指针的算术运算上
3、应用:
1)、打印是占位符是%zu,也可以是%u、%lu
2)、不要将负数赋值给size_t类型,一定要赋值整数才行
3)、对指针使用sizeof运算获取指针长度
代码如下:
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 size_t sVar1 = -5; 6 size_t sVar2 = 9; 7 printf("sVar1: %d and sVar2: %d ", sVar1, sVar2); 8 printf("sVar1: %zu and sVar2: %zu ", sVar1, sVar2); 9 10 int iVar1 = 19; 11 char chVar1 = 'A'; 12 int *ptrVar1 = &iVar1; 13 char *ptrCh = &chVar1; 14 printf("iVar value %d and *ptrVar1 value %d ", iVar1, *ptrVar1); 15 printf("iVar address %p and *ptrVar1 address %p ", &iVar1, ptrVar1); 16 printf("chVar1 value %c and *ptrCh value %c ", chVar1, *ptrCh); 17 printf("chVar1 address %p and *ptrCh address %p ", &chVar1, ptrCh); 18 printf("*ptrVar1 length %d and *ptrCh length %d ", sizeof(ptrVar1), sizeof(ptrCh)); 19 20 return 0; 21 }
代码结果:
sVar1: -5 and sVar2: 9 sVar1: 18446744073709551611 and sVar2: 9 iVar value 19 and *ptrVar1 value 19 iVar address 0x7ffc32ae218c and *ptrVar1 address 0x7ffc32ae218c chVar1 value A and *ptrCh value A chVar1 address 0x7ffc32ae218b and *ptrCh address 0x7ffc32ae218b *ptrVar1 length 8 and *ptrCh length 8
通过代码很容易发现指针长度都是一样的,与指针类型没有关系。
二、ptrdiff_t:用于处理指针算术运算,主要是表示两个指针差值的可移植方式
三、intptr_t:用于存储指针地址,主要存放指针地址,提供了一种可移植且安全的方法声明指针,且时刻与系统使用指针长度相同
四、unitptr_t:用于存储指针地址,是上边的无符号版本,功能基本一样,将指针转换成整数非常方便有用