该系列文章源于《深入理解C指针》的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教。  

  一、指针声明:

    1、声明普通变量:“数据类型 + 空格 +  变量名 + ;”实现普通变量的声明语句;

    2、声明指针:“数据类型 + 空格 +  变量名 + ;”只要在数据类型和变量名之间加一个“*"即可;

    3、应用:

      int  var1 = 10;            //声明普通变量,int是数据类型,空格作为int和var1的分割符,var1作为变量名

      (1)int * ptrVar1;         //*表明将变量声明为指针

      (2)int* ptrVar1;

      (3)int *ptrVar1;

      (4)int*ptrVar1;          //(1)(2)(3)(4)四种声明方式都是合法的,并且是完全等价的, 根据自己的眼光选择并坚持即可

      注*:*既可以作为指针变量的声明标志;*也可以作为乘法运算的符号;*又可以作为指针的解引用中,可以根据上下文很容易区别

  二、&操作符:

    1、返回操作变量的地址;

    2、常常利用之完成指针的初始化,一般在指针声明之后应尽快初始化;

    3、应用:

      &var1;             //获取变量var1的地址;下面千万不能写*ptrVar1 = &var1;否则程序一定会出错的

      ptrVar1 = &var1         //将变量var1的地址赋值给指针变量ptrVar1,通常又称为指针指向变量var1,

  三、指针解引:

    1、返回指针变量值(地址)处的变量值;

    2、常常利用之完成指针的修改;

    3、应用:

      var1 = 11;             //使用变量var1修改其内容,由10变为11

      *ptrVar1 = 12;           //使用指针解引*ptrVar1修改变量var1内容,由11变为12

  四、指针打印:

    1、打印指针变量值(地址)或普通变量的地址,在printf函数中,使用%x、%0、%p占位符占位即可;

    2、常常查看指针的值或变量的地址,一般打印出来的是虚拟内存地址;

    3、应用:

      程序代码,打印变量var1地址和指针变量ptrVar1的值,通过指针变量的使用,为修改变量提供新的思路:

  #include <stdio.h>

  int main(int argc, char **argv)
{
int var1 = ;
int *ptrVar1 = &var1;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); return ;
}

    执行结果:

The ptrVar1 address: 0x7fff937d6250
The var1 address: 0x7fff937d625c and ptrVar1 value: 0x7fff937d625c
The var1 value: and *ptrVar1 value:

    修改后的代码:

  #include <stdio.h>

  int main(int argc, char **argv)
{
int var1 = ;
int *ptrVar1 = &var1;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); var1 = ;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); *ptrVar1 = ;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); return ;
}

    修改后的执行结果:

The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:
The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:
The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:

  五、指针阅读:

    1、遇到复杂的指针表达式时,从右往左阅读指针表达式更容易;

    2、应用:

      (1)const int *ptrVar1;        //最右边的ptrVar1是一个变量

      (2)const int *ptrVar1;        //ptrVar1是一个指针变量

      (3)const int *ptrVar1;        //ptrVar1是一个指向整型数据的指针变量

      (4)const int *ptrVar1;         //ptrVar1是一个指向整型常量数据的指针变量

  六、指针拾遗:

    1、空指针的表示可以让指针赋值为NULL,也可以将指针赋值为整型值0,也可以将指针赋值为字符型数据'\0',根据自己的需要选择

      1)、ptrVar1 = 0;        //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址

      2)、ptrVar1 = NULL;        //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址

    2、void指针,通用指针,万能指针,可以转换成任何类型的指针,它有几个特点:

      1)、void指针具有与char指针相同的形式和内存对其方式;

      2)、void指针和别的指针永远不会相等,除非两个都是NULL的void型指针;

      3)、任何指针都可以被赋值给void指针,并能被顺利完好的转换回来;

      4)、void指针只能用在数据指针,不能用于函数指针上

      5)、void指针可以转换成任何指针,一旦转换成与原来不同类型的指针,就无法再安全转换成原来的指针了;

    

05深入理解C指针之---指针声明和解引的更多相关文章

  1. 10深入理解C指针之---指针运算和比较

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针运算有很多种,主要有指针的声明*.指针的解引*.指针指向(*).或->.指针 ...

  2. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  3. [C/C++]如何解读返回函数指针的函数声明

    今天在看<深入理解C++11>的时候,看到一段有意思的代码: int (*(*pf())())() { return nullptr; } 我立刻就懵了——从来没有见过这样的函数声明.那么 ...

  4. 深入理解C语言函数指针(转)

    本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...

  5. 02深入理解C指针之---指针类型和值

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 1.指针的类型: 可以在声明指针时,指定指针的类型,例如: (1)void *x  声 ...

  6. 06深入理解C指针之---指针操作和比较

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操 ...

  7. 00深入理解C指针之--- 指针之外

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...

  8. 这样子来理解C语言中指针的指针

    友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...

  9. 从四个属性的角度来理解C语言的指针也许会更好理解

    文章会在文末更新! 关于指针是什么,很多教材已经作出了定义,大多数都会定义为"存放变量内存地址的变量".从这句话中我觉得除了让我知道这个定义有11个字以外,其他就没什么用了.我个人 ...

随机推荐

  1. 【上下界网络流 费用流】bzoj2055: 80人环游世界

    EK费用流居然写错了…… Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个80人的团 ...

  2. 教程笔记《JavaScript深入浅出》

    一.数据类型 javascript是弱数据类型语言,不需要显式的定义类型,一共有如下六种数据类型 五种基本类型:number,string,boolean,null,undefined 一种复合类型: ...

  3. Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

  4. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

  5. Python入门基本语法

      Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...

  6. 剑指Offer(书):顺时针打印数组

    题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 ...

  7. Cleaning Shifts POJ - 2376 (贪心题)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31194   Accepted: 7677 ...

  8. MySQL迁移至MariaDB

    为什么要用MariaDB来代替MySQL MariaDB是MySQL社区开发的分支,也是一个增强型的替代品.它由MySQL前开发者们带头组织的基金会开发,使用起来和MySQL完全一样.自从Oracle ...

  9. LightOj:1422-Halloween Costumes

    传送门:http://www.lightoj.com/volume_showproblem.php?problem=1422 Halloween Costumes problem descriptio ...

  10. Educational Codeforces Round 2 Edge coloring of bipartite graph

    题意: 输入一个二分图,用最少的颜色数给它的每条边染色,使得同一个顶点连的边中颜色互不相同. 输出至少需要的颜色数和任意一种染色方案. 分析: 证明不会,只说一下(偷瞄巨巨代码学到的)做法. 假设点的 ...