标签:
简单来说,指针包含的就是内存地址。理解指针关键在于理解C的内存管理模式。C里面有三种内存:
①、静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静态变量作用域在定义它们的函数内部);
②、自动内存(在函数内部声明的变量,在函数被调用时创建,作用域和生命周期都在函数内部);
③、动态内存(内存分配在堆上,根据需要释放,通过指针引用,作用域局限于引用的指针);
下面先来生命一个指针并打印其地址和值,这里p%指的是以十六进制的形式返回数据:
#include <stdio.h> main()
{ int num=5; int* pi=# printf("Address of pi is : %p\n Value: %p\n", &pi, pi);
//Address of pi is : 0xbfa98298
//Value: 0xbfa98294 }
间接引用操作符(*)返回指针变量指向的值,一般称为解引指针。我们可以把接引操作符的结果用作左值,“左值”指赋值操作符左边的操作数,所有左值都必须可以修改,因为它们会被赋值。
*pi = 10; printf("%d\n", num);
null有几种不同的应用情况,这可能使它被误解。null被赋值给指针就说明该指针不指向任何东西。当然他还是有自己的地址,但是他的value将是空的。NULL宏是强制转换为void指针的整数常量0。很多头文件都包含这个定义,如stddef.h,stdblib.h,stdio.h。通过NULL宏来获取null指针。ASCII字符NUL定义为全0的字节。null语句就是只有一个分号的语句。null字符串就是空字符串。注意为初始化的指针可能包含任何值,但是null指针不会引用内存中 任何地址。当指针为null时,if(指针)表示false,反之表示true。
NULL宏:
#define NULL ((void*) 0)
int* pi1 = 0;//1
int* pi2 = NULL//2
1和2是等价的。在这里,根据不同上下文,数字0被重载了,表示null指针。
void指针是通用类型指针,用来存放任何数据类型的引用。任何指针都可以被赋值给void指针,也可以转换成原来的指针类型,因此我们应该小心不能胡乱转换,因为不同类型的指针长度不一定相同。使用sizeof()函数打印指针的长度:
printf("size of *pi is : %d\n", sizeof(*pi));
当指针被声明全局或静态,就会在程序启动时被初始化为NULL。指针的实际长度取决于使用的机器和编译器。不同的计算机给C的数据类型分配空间采用不同的数据模型。一种操作系统可能支持多种模型,具体采用哪种通常由编译器决定。
使用指针时可能遇到一下预定义类型:
①、size_t :用于安全的表示长度;
②、ptrdiff_t:用于处理指针算术运算;
③、intptr_t和uintptr_t:用于存储指针地址;
size_t类型表示C中任何对象能达到的最大长度。它是无符号整数。size_t作为sizeof操作符的返回值类型,同时也是很多函数如malloc和strlen的参数类型。打印size_t可以用 %zu 或 %u格式说明符。
intptr_t和uintptr_t类型用来存放指针地址。它们提供了一种可移植且安全的方法声明指针,而且和系统中使用的指针长度相同。
指针有如下几种操作符:
* 声明指针
* 解引指针
-> 指向操作符
+ 加法
- 减法
== != 相等、不等
> >= < <= 大于大于等于小于小于等于
数据指针可以执行以下算数运算:
加上整数;实际加的数是整数与指针数据类型对应字节的乘积。
减去整数;原理同上。
两个指针相减;一个指针减去另一个指针得到两个指针间的差值。同样这个差值是"单位"数,是实际地址差除以数据对应字节数的值。ptrdiff_t类型用于表示两个指针差值的可移植方式。
比较指针;差值和比较指针通常在数组方面比较有用,可以用来判断元素顺序。
指针支持多层间接引用。指向指针的指针叫做“双重指针”。
未完待续。
标签:
原文地址:http://www.cnblogs.com/amazonove/p/4174797.html