一:基础认知:
                Point_Type*   Point_Name =  & (var_Type   var)

指针类型*  指针名 = & 变量名(变量和指针必须为同一数据类型,因为是按数据类型的不同来划分内存大小的)

   int a=12;

               int* p=NULL;

                p=&a;

                printf(*p);

                

其中:

                &(取址符):p=&a 是返回a的地址赋值给指针变量p

                *                    :*p 是访问并返回指针变量p所存储的地址(a的地址)里面的值(a的值)

例如:把int型指针p指向int型变量var:

 其中,&(取址符)的作用是取var的地址;而指针p是一个存储变量地址的指针变量;在指针p前面加一个‘ * ’则是访问指针p存储的变量地址所在的地址存储的值(即访问var的值)   

输出一个指针变量保存的内容(也就是地址)用  %p  :

var把自己的地址赋给p,  所以p(int指针型变量)的内存地址上存储的是var变量的地址;

*p是p存储的变量(var)地址存储的值(12);

所以:p==&var  ;   

           *p==var;

图解:

例如:把一个int型变量的地址赋值给int型指针变量p(在int型指针变量p上存储一个int型变量的地址)

#include <stdio.h>
int main()
{int a = 12;int* prt = &a;int* p;//int型指针变量指向一个int型变量的地址(即int型指针变量存储int型变量地址)printf("int a的地址:%p\tint a的值:%d\n",&a,a);printf("int* prt的地址:%p\tint* prt的值:%p\nint* prt指向的int型变量地址上存储的int型的值:%d\n",&prt,prt,*prt);printf("请输入一个int型变量的地址:\n");scanf_s("%p",&p);//在int型指针变量p上存储一个int型变量的地址printf("int* p的地址:%p\tint* p的值:%p\nint* p指向的int型变量地址上存储的int型的值:%d",&p,p,*p);return 0;
}

结果:

二、指针和数组:
                int* p=NULL  (假设指针p是int型的指针,赋初始值为NULL(常量0))

        (1)p++:指针p的值加4(因为p是Int型指针,所以内存单位是4个单位),即在指针p本身的地址原本所存储的变量的地址上加4,所以p++是指指针p向后移动4个内存单位

(在int数组里面表现为访问下一个元素)

        (1)p--:指针p的值4(因为p是Int型指针,所以内存单位是4个单位),即在指针p本身的地址原本所存储的变量的地址上4,所以p++是指指针p向移动4个内存单位

(在int数组里面表现为访问一个元素)

          例如:


#include <stdio.h>
#define M 3int main()
{int i = 0;int group[] = {12,23,34};int* p = group; //p的值默认为group[0]的地址,即p指向group[0]while (p <= &(group[M-1]))  //指针p的值(p所指向的变量的地址)小于等于group[2]的地址:即p的值从group[0]的地址移动到group[2]的地址,步长为4(int){printf("\ngroup[%d]=%d\t&group[%d]=%p\tp=%p\t,*p=%d\t&p(指针变量p本身的地址)=%p", i, group[i],i,&group[i],p,*p,&p);p++;//指针往后移动4个存储单位(int型)i++;}return 0;
}

   结果:

可以看到:group[i]==*p ;&group[i]==p ;&p一直没有变

且:&group[i]-&group[i-1]==4          其中  i 属于[1,2]     (p一次移动4给内存单位)

上述代码图解:

三、指针和函数:

        

(1)引用调用&传值调用:

                a、当指针作为函数的参数时,实现引用调用,引用调用就相当于把你家的地址告诉了别人,那么别人就可以在你家偷东西或放东西(修改变量的存储地址上存储的数据),比如本来你家只有一个苹果,但是被A(知道你家地址的人,相当于存储了变量地址的指针变量)换成了香蕉(进行了修改操作),那你再访问你家(地址),就只能看见香蕉了(修改后的数据),所以你只能拿香蕉(修改后的数据)去进行其他操作。

                b、当一个基本类型的变量作为函数的参数时,实现传值调用,传值调用相当于赋值(a=b),把b的value的副本给a,a和b除了当前的value相等,没有其他联系。

#include <stdio.h>void swap1(int* a,int* b)
{int i = 0;i = *a;*a = *b;*b = i;printf("\nswap1().a(int*)的地址:%p\tswap1().b(int*)的地址:%p\t",&a,&b);
}void swap2(int a,int b)
{int i = 0;i = a;a = b;b = i;printf("\nswap2().a(int)的地址:%p\tswap2().b(int)的地址:%p\t", &a, &b);
}int main()
{int a = 23, b = 48;printf("\na的地址:%p\tb的地址:%p",&a,&b);printf("\n\n\n");swap2(a, b);printf("\n传值调用:a=%d,b=%d\t",a,b);printf("\n\n\n");swap1(&a,&b);printf("\n引用调用:a=%d,b=%d\t",a,b);printf("\n\n\n");return 0;
}

结果:

void swap1(int* a,int* b)图解:

四、指针的指针

                (1)概念

int a=12;

int* p=&a;    //p是指向int型变量的指针变量,所以p是指向变量a的指针,p指向a的地址(int型指针p存储a的地址)

int** pp=&p;  //pp是指向int型指针的指针变量,所以pp是指针p的指针,pp指向p的地址(int型指针的指针pp存储p的地址)

(2)例子

#include <stdio.h>int main()
{int a = 12;int* p = &a;  //把a的地址赋值给int型指针pint** pp = &p;    //把指针p地址赋值给int型指针的指针ppprintf("\na的地址:%p\ta的值:%d\np的地址:%p\tp的值:%p\npp的地址:%p\tpp的值:%p",&a,a,&p,p,&pp,pp);//输出地址用:%preturn 0;
}

结果:

可以看到:

指针p存储的值(value)是a的地址(p指向a);

                指针的指针pp存储的值(value)是指针p的地址(pp指向p);

图解:

                (3)*

访问并返回一个指针(p)所指向的变量的value:*p

访问并返回一个指针的指针(pp)所指向的指针(p)所指向的变量的value:**pp

(哈哈哈哈哈,有点绕口,哈哈哈哈哈)

如下例:

#include <stdio.h>int main()
{int a = 12;int* p = &a;  //把a的地址赋值给int型指针pint** pp = &p;    //把指针p地址赋值给int型指针的指针pp//printf("\na的地址:%p\ta的值:%d\np的地址:%p\tp的值:%p\npp的地址:%p\tpp的值:%p",&a,a,&p,p,&pp,pp);//输出地址用:%pprintf("\n\n\na==%d\t*p==%d\t**pp==%d\n",a,*p,**pp);return 0;
}

结果:

理论上来讲:

*p是根据p存储的变量(a)的地址来访问该变量(a),并返回该变量地址上存储的数据(12)

**pp:第一个‘*’是 *pp,是根据pp存储的指针变量(p)的地址来访问该指针变量(p),并返回该指针变量(p)的地址上存储的地址(a的地址);第二个‘*’是  *(*pp)相当于 *(p),即根据p存储的变量(a)的地址来访问该变量(a),并返回该变量地址上存储的数据(12)

也可以再一次用这张图解释:

指针知识点总结(C语言)相关推荐

  1. c语言获取指针分配的字节数,c语言指针知识点总结(共6篇).docx

    c语言指针知识点总结(共6篇) C语言指针教学中的知识点分析与总结 摘要:分析指针的基本概念及指针在数组.函数.字符串.动态存储分配等方面的应用,提出指针教学过程中易混淆概念及注意事项,对初学者深入理 ...

  2. C语言指针知识点小结

    前期回顾   C语言指针基础知识点(一)–指针及指针变量   C语言指针基础知识点(二)–指针变量的引用   C语言指针基础知识点(三)–指针变量作为函数参数   C语言指针基础知识点(四)–通过指针 ...

  3. 交换变量地址 c语言,C/C++知识点之C语言内存地址交换

    本文主要向大家介绍了C/C++知识点之C语言内存地址交换,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.C语言课很无聊,因为之前学过C#所以就感觉特别的无聊. 但是,只能说我看过, ...

  4. c语言指针变量字节,C语言指针变量类型和大小

    指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?接下来对指针类型进行分析,剖析指针类型的特点. 指针的大小与其指向的内存中存储的变量类型无关,它只与计 ...

  5. C语言中定义加号的数据类型,C/C++知识点之c语言基础数据类型及命名规范

    本文主要向大家介绍了C/C++知识点之c语言基础数据类型及命名规范,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助.1. 常量是程序运行期间不能被改变的量; 变量代表一个存储区域,存 ...

  6. C语言指针入门 《C语言非常道》

    C语言指针入门 <C语言非常道> 作为一个程序员,我接触 C 语言有十年了.有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出. 但是,李忠老师 ...

  7. C语言 函数指针和指针函数区别 - C语言零基础入门教程

    目录 一.函数指针和指针函数声明的区别 1.函数指针 2.指针函数 二.函数指针和指针函数调用的区别 1.函数指针的调用 2.指针函数的调用 三.猜你喜欢 零基础 Python 学习路线推荐 : C/ ...

  8. 二级c语言需要知道的知识点,2020年全国计算机二级C语言复习知识点:C语言基本知识(...

    [摘要] 即将参加全国计算机等级考试的考生们,考试即将到来,大家的备考工作进行得如何了?考必过为大家精心整理了2020年全国计算机二级C语言复习知识点:C语言基本知识(,希望能够助力全国计算机等级考试 ...

  9. c语言中通过指针引用数组,C语言基础(二)

    指针引用数组 C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素. 引入指针变量后,就可以用两种方法来访问数组元素了.如果p的初值为&a[0],则: p+i和 ...

  10. C下的全局变量和指针 - C/C++ / C语言

    C下的全局变量和指针 - C/C++ / C语言 全局变量的使用基本会经历以下阶段. 滥用 - 害怕使用 - 想用就用. 个人觉得使用全局变量的需要的条件. 1.可控. 2.带来比较大的编程收益. 3 ...

最新文章

  1. cgroups是什么
  2. 据我所知,这是第一个完整实现运动分割、动态目标追踪等的「开源」动态SLAM系统!...
  3. 热议!“建议放学时间与父母下班时间一致”,网友:陪我一起996吗?
  4. sql server cvs 导入
  5. Debian Gnu/Linux 9关闭 111端口
  6. PCM设备在雷达通信系统应用
  7. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看
  8. 堆排序时间复杂度_图解堆结构、堆排序及堆的应用
  9. 大数据驱动业务决策,CDN实时日志重磅上线
  10. Elasticserch学习之分页
  11. 自动驾驶毫米波雷达物体检测技术-算法
  12. 树莓派做服务器装什么系统安装,树莓派 安装 群晖系统安装教程
  13. 不收费的数据恢复软件好用吗?数据丢失这样恢复
  14. hdu5855二分+最大流
  15. 制作文字水印图片、图片水印
  16. 微软输入法怎么打开软键盘?
  17. 解决方法:CC2640R2F从7x7改成5x5封装,主机连接失败
  18. Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
  19. 数据科学面试应关注的6个要点
  20. 三种伺服电机控制方式总结

热门文章

  1. 瑞幸咖啡CMO杨飞:一切产品皆可裂变,一切创意皆可分享
  2. 天空飘彩带的css3代码_纯CSS3实现飘逸洒脱带有飞行效果的三级下拉菜单
  3. TS报错:TS2532: Object is possibly ‘undefined‘.
  4. 我眼中的光明·第三周
  5. LTE学习笔记:物理层
  6. 关于云计算资源调度的一些思考
  7. 华为云 两个手机 同步_HDC.Cloud | 技术探秘:华为云鲲鹏云手机何以公有云业界独家...
  8. 云流量成为数据中心的王者 五年内全球超大规模IDC将不断出现
  9. oracle-ORA-22922: 不存在的 LOB 值
  10. 一个关于封装、继承、多态的问题