深入理解C指针之---指针类型和长度
该系列文章源于《深入理解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\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
通过代码很容易发现指针长度都是一样的,与指针类型没有关系。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。