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

  简单来说,指针包含的就是内存地址。理解指针关键在于理解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;//1int* 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类型用于表示两个指针差值的可移植方式。

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

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

  未完待续。

时间: 2024-08-02 02:43:30

深入理解C指针之一:初识指针的相关文章

深入理解C指针之四:指针和数组

数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数组和指针的区别之一就是,尽管数组的名字可以返回数组地址,但是名字不能作为赋值操作的目标. 概述 数组是能用索引访问的同质元素连续集合.数组的元素在内存中是相邻的,而且元素都是同一类型的.数组的长度是固定的,realloc函数和变长数组提供了应对长度需要变化的数组的技术. 一维数组是线性结构,用一个索引访问成员.取决于不同的内存模型,数组

彻底理解链表中为何使用二级指针或者一级指针的引用

 彻底理解链表中为何使用二级指针或者一级指针的引用 http://blog.csdn.net/u012434102/article/details/44886339 struct _node  {  void*data;  struct_node *prior;  struct_node *next;  } typedef_node Node;   //给这个_node结构体定义一个别名,任何使用_node的地方都可以用Node来替换 typedef_node* PNode;   //给这个指向

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

关于指针类型和指针类型转换的理解

id="mainContent"> 前几天在判断  "值相同的两个指针所指向的变量的值可以不同 "  这句话时,发现自己对指针类型一些概念仅仅是记住了结论.于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识.  一些用到的 开始之前,先来复习一些会用到的知识. 1.地址,字节,位 位(bit)是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit).

深入理解 [指针函数] 、[函数指针]、[指针的指针]、[指向指针数组的指针]

指针函数 1.指针函数是指带指针的函数,即本质是一个函数.当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中. 函数返回类型是某一类型的指针: 格式: 类型标识符  *函数名(参数表) int *match(void *key_x,void *key_y); 解析:首先来说它是一个函数,只不过这个函数的返回值是一个地址值.函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针

1.1 初识指针

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 1.指针的类型 从语法的角度看, 你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的

深入理解C指针之五:指针和字符串

基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.不过,并非所有的字符数组都是字符串.例如,字符数组可能没有NUL字符. C中有两种类型的字符串. * 单字节字符串.由char数据类型组成的序列. * 宽字符串.由wchar_t数据类型组成的序列. wchar_t数据类型用来表示宽字符串,可能是16位或32位宽.这两种字符串都以NUL结尾.宽字符主要用来

【C++】【lambda】lambda函数介绍和个人理解(1)——初识lambda

导航: lambda函数介绍和个人理解(1)--初识lambda lambda函数介绍和个人理解(2)--lambda与仿函数 lambda函数介绍和个人理解(3)--lambda的语法甜点 什么是lambda函数? 其实,lambda函数我个人更愿意称为lambda运算(lambdacalculus),它是用来表示一种匿名函数.这个严格意义上属于"函数式编程"(Functional Programming)的范畴.当然还是先解释下函数式编程的概念的好.按照当时冯·诺依曼机器的基本计算

浅谈 .NET 中的对象引用、非托管指针和托管指针

目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五.托管指针 前言 本文主要是以 C# 为例介绍 .NET 中的三种指针类型(本文不包含对于函数指针的介绍):对象引用.非托管指针 .托管指针. 学习是一个不断深化理解的过程,借此博客,把自己关于 .NET 中指针相关的理解和大家一起讨论一下,若有表述不清楚,理解不正确之处,还请大家批评指正. 开始话题之前,我们不妨先对一些概念作出定义. 变量:给存储单元