博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
07深入理解C指针之---指针类型和长度
阅读量:5058 次
发布时间:2019-06-12

本文共 1934 字,大约阅读时间需要 6 分钟。

  该系列文章源于《深入理解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 
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: 9sVar1: 18446744073709551611 and sVar2: 9iVar value 19 and *ptrVar1 value 19iVar address 0x7ffc32ae218c and *ptrVar1 address 0x7ffc32ae218cchVar1 value A and *ptrCh value AchVar1 address 0x7ffc32ae218b and *ptrCh address 0x7ffc32ae218b*ptrVar1 length 8 and *ptrCh length 8

  通过代码很容易发现指针长度都是一样的,与指针类型没有关系。

  二、ptrdiff_t:用于处理指针算术运算,主要是表示两个指针差值的可移植方式

  三、intptr_t:用于存储指针地址,主要存放指针地址,提供了一种可移植且安全的方法声明指针,且时刻与系统使用指针长度相同

  四、unitptr_t:用于存储指针地址,是上边的无符号版本,功能基本一样,将指针转换成整数非常方便有用

转载于:https://www.cnblogs.com/guochaoxxl/p/6949530.html

你可能感兴趣的文章
IOS-每个程序员的编程之路上都应该看这11本书
查看>>
自定义tabbar(纯代码)
查看>>
小程序底部导航栏
查看>>
ibatis学习笔记
查看>>
18-ES6(1)
查看>>
poj1611 简单并查集
查看>>
Ubuntu 14.04下安装CUDA8.0
查看>>
跨平台开发 -- C# 使用 C/C++ 生成的动态链接库
查看>>
C# BS消息推送 SignalR介绍(一)
查看>>
WPF星空效果
查看>>
WPF Layout 系统概述——Arrange
查看>>
PIGOSS
查看>>
几款Http小服务器
查看>>
iOS 数组排序
查看>>
第三节
查看>>
PHP结合MYSQL记录结果分页呈现(比较实用)
查看>>
Mysql支持的数据类型
查看>>
openSuse beginner
查看>>
Codeforces 620E(线段树+dfs序+状态压缩)
查看>>
Windows7中双击py文件运行程序
查看>>