该系列文章源于《深刻理解C指针》的阅读与理解,因为本人的见识和知识的欠缺可能有误,还望你们批评指教。数组
若是考虑到程序的可移植性和跨平台性时,指针长度就是一个问题,须要慎重处理。通常状况下,数据指针的长度时同样的,与指针类型无关,void型指针、char型指针、结构体指针等通通是同样的,函数指针的长度通常与数据指针长度不一样。指针长度与CPU有关,严格意义上说与OS到底是32位仍是64位有关,同时不一样的编译器分配内存时,长度也是不同的。与指针相关的四种预约义类型以下:安全
1、size_t:用于安全表示长度,全部平台和系统都会解析成本身对应的长度函数
一、定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数;经常定义在stdio.h或stdlib.h中spa
二、特征:指针
1)、提供一种可移植的方式来声明与系统中可寻址的内存区域一致的长度code
2)、用做sizeof操做符的返回值的类型对象
3)、用做内存相关函数malloc()和strlen()的参数类型blog
4)、经常使用来声明字符个数、循环计数、数组索引的长度索引
5)、能够用在指针的算术运算上内存
三、应用:
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\n", sVar1, sVar2); 8 printf("sVar1: %zu and sVar2: %zu\n", 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\n", iVar1, *ptrVar1); 15 printf("iVar address %p and *ptrVar1 address %p\n", &iVar1, ptrVar1); 16 printf("chVar1 value %c and *ptrCh value %c\n", chVar1, *ptrCh); 17 printf("chVar1 address %p and *ptrCh address %p\n", &chVar1, ptrCh); 18 printf("*ptrVar1 length %d and *ptrCh length %d\n", 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
经过代码很容易发现指针长度都是同样的,与指针类型没有关系。
2、ptrdiff_t:用于处理指针算术运算,主要是表示两个指针差值的可移植方式
3、intptr_t:用于存储指针地址,主要存放指针地址,提供了一种可移植且安全的方法声明指针,且时刻与系统使用指针长度相同
4、unitptr_t:用于存储指针地址,是上边的无符号版本,功能基本同样,将指针转换成整数很是方便有用