指针是一个值为内存地址的变量, 指针的核心是它是一个变量, 只不过它是用来存放内存地址的, 所以在了解指针之前,先说一下什么是变量。变量就是在内存中开辟的一个空间。如int year, 就是在内存中开辟了一个空间,空间名称为year, 开辟空间做什么呢?肯定是存放程序运行中所需要的东西,在计算机语言中,存放东西就是赋值。year= 2018, 给year赋值,就是在year这个空间中存放一个整数2018; 开辟了空间,也存放了数值,那我们要使用这个空间中的东西怎么办?我们怎样才能找到这个空间?当然,最简单的办法,是直接使用名称year, 其实还有一种办法,就是找到这个空间的地址,找到地址后,我们就可以做任何事情了。内存在开辟空间的时候,自动就会获得一个地址,这个地址就是内存地址,这和我们日常生活也是一样的道理。比如开发商拿了一块地,它就相当于开辟了空间。拿地的同时,也就是开辟空间的时候,它自动会有一个地址,他在广东省拿的地,地址肯定是广东省,而不是北京,并且地址在获得之后,也不会再发生变化。只不过地址描述方式不同,在现实生活中,它是广东省深圳市,而在计算机中,它是一个十六进制的数字, 0060FF08;

  每一个变量都有地址,那怎么才能获取到变量地址呢?C语言提供了一个&运算符来获取内存地址,&year 就取得了year内存地址。 获取到地址后,肯定要操作这个地址,要不然,我们获取它做什么。操作它就要先保存起来,保存东西就是用 变量,所以还要声明一个变量,由于这个变量是用来保存内存地址的,所以变量的声明也不太一样,在变量之前加了一个*号。 int *pointer_year., pointer_year 就可以保存整型变量的地址。由于变量year也是一个整型,所以就可以把year的地址存放到pointer_year中。 pointer_year = &year,  pointer_year 保存的是year的内存地址,这时也可以称之为pointer_year 指向了year,所以就给point_year变量起了一个名称------指针。指针变量和普通变量一样,都是用保存东西的。但又有所区别,它保存的是另一个变量的内存地址,可以通过它找到另一个变量,从来操作另一个变量。 还要注意一点:指针变量有一个特殊的常量,NULL, 表示为空, 如point_year = NULL, 表示指针不指向任何地址,可以用它来初始化指针变量,也可以用它来释放内存。

int main()
{
    ;
    int * pointer_year = &year;
    printf("the memory address for year is %p \n", pointer_year);

    pointer_year = NULL;
    printf("the memory address for year is %p", pointer_year);

    ;
}

  现在我们有了变量的地址,也保存起来了,那就可以顺藤摸瓜地找到内存地址对应的空间,也就是相对应的变量。运算符还是用*, *pointer_year,就会获取到pointer_year内存地址所对应的空间。pointer_year只是一个地址,就相当于黄页中的汉字,只是写着广东省深圳市这几个字,要想做什么事,肯定要真正到这个地方去。*运算符,就相当于我们驾车到广东省深圳市这个地方作考察。只要到了这个地方,我们就可以做任何事情了,比如建工厂,盖房子。*pointer_year,就相当于到了它所指向的内存空间,那么就可以查看,修改。*point_year = 10;就是对pointer_year指向的内存空间进行了修改。当* 作为运算符的时候,叫做取地址所对应的值,所以它只能放在指针变量的前面, 取出地址所指向的值,那就是变量。*point_year 的值就是变量year.  *point_year = 10; 其实就是对量year赋值。

int main()
{
    ;
    int * pointer_year = &year;
    printf("year变量的内存地址 %p \n", pointer_year);

    *pointer_year = ;

    printf("year变量通过地址进行修改,修改后的值为%d\n", year);

    ;
}

  

  指针变量也是变量,所以它也有地址,&point_year 就是取指针变量对应的地址。它是一个地址,所以还要声明一个指针变量 int ** pointer_p_year = &point_year.  这里要注意,声明变量的时候,要有两个**

int main()
{
    ;
    int * pointer_year = &year;
    // 取指针变量pointer_year 的地址存放到 pointer_p_year变量中
    int ** pointer_p_year = &pointer_year;
    // 打印地址
    printf("year变量的内存地址 %p \n", pointer_year);
    printf("指针变量pointer_year的内存地址 %p \n", pointer_p_year);

    ;
}

  那么我们*运算符也是可以取地址,*pointer_p_year 返回的是point_year, 然而它也是一个指针变量,*point_year 才是指向的变量。**pointer_p_year 批向了year,  **pointer_p_year = 10, 同样是给它变量year赋值。

int main()
{
    ;
    int * pointer_year = &year;
    // 取指针变量pointer_year 的地址存放到 pointer_p_year变量中
    int ** pointer_p_year = &pointer_year;
    // 打针地址
    printf("指针变量pointer_year的内存地址 %p \n", pointer_p_year);

    // 通过地址的地址修改变量值
    **pointer_p_year = ;
     printf("变量year的值 %d \n", year);
    ;
}

  指针与数组:

  数组是在内存中开辟的一块连续的内存空间, 而数组名则是这块连续内存空间的首地址, 首地址其实就是数组第一个元素的地址。知道了首地址,又是连续的内存空间,我们就可以通过移动指针来访问数组中的元素。怎么才能移动指针呢? 使用 +或-号, 当指针加1的时候,它就会指向下一个内存地址。一个类型为T的指针的移动,以sizeof(T) 为移动单位, sizeof 是一个函数,接受一个元素或数据类型作为参数,返回这个元素或类型所占的内存空间。int * p;  执行 p + 1; 指针p 就会移动sizeof(int), 4个 字节。

  数组也可以存放指针类型的数据。

Int * arr[]; // arr数组是一个指针数组,数组中所有的元素都保存指针。

;
;
;

arr[] = &one;
arr[]= &two;
arr[] = &three;

  指针与函数

  如果一个函数可以接受任何类型的指针变量,可以把这个函数参数设为void *;

Int  add(void *data);  // add 函数可以接受任意类型的指针变量。

  函数指针: 重点是指针,指向函数的指针,它的声明的方式有点奇怪

  函数类型 (*指针变量名)(形参列表);第一个括号一定不能少

Int (*add)(int a, int b);  // add 变量 就可以指向一个函数.
int f(a, b);
add = f;

(*add)(, ); // 调用函数指针

  指针函数:重点是函数,只不过它返回的是一个指针。Int * add();

C 语言----- 指针的更多相关文章

  1. C语言指针转换为intptr_t类型

    1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...

  2. [转]C语言指针学习经验总结浅谈

    指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...

  3. 不可或缺 Windows Native (7) - C 语言: 指针

    [源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...

  4. C语言指针学习

    C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...

  5. (转载)c语言指针学习

    前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...

  6. 关于C语言指针的问题

    在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  7. C语言指针类型 强制转换

    关于C语言指针类型 强制转换  引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...

  8. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  9. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  10. C语言指针声明探秘

    C语言指针声明探秘

随机推荐

  1. 1-STM32带你入坑系列(STM32介绍)

    由于自己的物联网开发板上的单片机是用的STM32,但是有些朋友没有用过,所以我将用这块开发板,带着大家入门STM32 先介绍一下STM32,我是在大三下学期的时候开始接触STM32,当时是想做一个小车 ...

  2. GC调优在Spark应用中的实践(转载)

    Spark是时下非常热门的大数据计算框架,以其卓越的性能优势.独特的架构.易用的用户接口和丰富的分析计算库,正在工业界获得越来越广泛的应用.与Hadoop.HBase生态圈的众多项目一样,Spark的 ...

  3. 使用Filter过滤器+重写Request完美解决乱码问题

    一:原理 1.对于Post方式提交的数据,我们可以通过直接设置request和response的编码方式来解决乱码问题:但是Get方式提交的数据,那么就需要编码再解码的方式解决乱码问题. 2.我们一般 ...

  4. 如果IBM再给我一次实习机会

    2014年,我拿到了IBM斯图加特R&D的实习机会.在连续被索尼和博世拒掉之后,这个实习对我来说弥足珍贵.我学的是通信专业,在这之前与编程相关的活动只有一学期的安卓Lab,还是靠抱队友大腿才及 ...

  5. 单点登录SSO:图示和讲解

    目录 概述 示例运行效果动画 跨域Web SSO时序图 代码截图 几个基本概念 涉及的站点和页面 重点理解:单点登录的核心步骤 敢说最准确的单点登录图示,因为: 我严格对照所画时序图的每个步骤,开发了 ...

  6. mysqlfrm

    mysqlfrm可基于frm文件生成对应的表结构.常用于数据恢复场景. 其有两种操作模式. 1. 创建一个临时实例来解析frm文件. 2. 使用诊断模式解析frm文件. 以下表进行测试,看看, 1.  ...

  7. js判断当前浏览器页面是否切换

    公司做mifi设备,ui界面很多信息需要1S钟不断异步请求更新信息,如果同时打开多个浏览器或者多个当前界面,设备1S钟会收到很多个请求,由于设备本身内存限制,会导致响应速度过慢,且会造成设备重启等. ...

  8. Dapper.NET

    关于Dapper.NET的相关论述   年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近 ...

  9. [转帖]ulimit、limits.conf、sysctl和proc文件系统

    ulimit.limits.conf.sysctl和proc文件系统 来源:https://blog.csdn.net/weixin_33918114/article/details/86882372 ...

  10. [转帖]Docker的数据管理(volume/bind mount/tmpfs)

    Docker(十五)-Docker的数据管理(volume/bind mount/tmpfs) https://www.cnblogs.com/zhuochong/p/10069719.html do ...