码迷,mamicode.com
首页 > 其他好文 > 详细

深入理解C指针之一:初识指针

时间:2014-12-20 00:35:37      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

  简单来说,指针包含的就是内存地址。理解指针关键在于理解C的内存管理模式。C里面有三种内存:

  ①、静态全局内存(生命周期从程序开始到程序结束,全局变量作用域是全局,静态变量作用域在定义它们的函数内部);

  ②、自动内存(在函数内部声明的变量,在函数被调用时创建,作用域和生命周期都在函数内部);

  ③、动态内存(内存分配在堆上,根据需要释放,通过指针引用,作用域局限于引用的指针);

  下面先来生命一个指针并打印其地址和值,这里p%指的是以十六进制的形式返回数据:

#include <stdio.h>
main()
{
int num=5; int* pi=&num; 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类型用于表示两个指针差值的可移植方式。

  比较指针;差值和比较指针通常在数组方面比较有用,可以用来判断元素顺序。

  指针支持多层间接引用。指向指针的指针叫做“双重指针”。

  未完待续。

 

深入理解C指针之一:初识指针

标签:

原文地址:http://www.cnblogs.com/amazonove/p/4174797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!