指针是一个值为内存地址的变量, 指针的核心是它是一个变量, 只不过它是用来存放内存地址的, 所以在了解指针之前,先说一下什么是变量。变量就是在内存中开辟的一个空间。如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. N维偏序:cdq分治

    cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...

  2. jmeter(二十四)dubbo接口测试

    最近工作中接到一个需求,需要对一个MQ消息队列进行性能测试,测试其消费能力,开发提供了一个dubbo服务来供我调用发送消息. 这篇博客,介绍下如何利用jmeter来测试dubbo接口,并进行性能测试. ...

  3. MVC5 + EF6 完整教程 (转)

    点击查看: MVC5 + EF6

  4. 简述DDOS攻击的工作原理

    1.DDOS攻击:大量的肉鸡对服务器的不同端口发送巨型流量的UDP报文,无法通关关闭端口的方式来进行隔离,破坏力极强,严重会造成服务器当机. SYN/ACK Flood攻击:经典最有效的DDOS方法. ...

  5. 串行FLASH文件系统FatFs---转自野火论坛

    为了支持长文件名,需要用到FATFS源码中的cc936.c的两个函数ff_convert,ff_wtoupper:这里面直接用了两个大数组(127KB)来做unicode转gbk(OEM)的对照表,这 ...

  6. Linux ACL 权限之进阶篇

    笔者在<Linux ACL 权限>一文中介绍了 Linux ACL 权限的基本用法,本文笔者将尝试探究 ACL 中的基本概念和实现原理,希望能够通过进一步的加深对 Linux 权限系统的理 ...

  7. ASP.NET MVC必须知道的那些事!

    MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...

  8. 朱晔和你聊Spring系列S1E8:凑活着用的Spring Cloud(含一个实际业务贯穿所有组件的完整例子)

    本文会以一个简单而完整的业务来阐述Spring Cloud Finchley.RELEASE版本常用组件的使用.如下图所示,本文会覆盖的组件有: Spring Cloud Netflix Zuul网关 ...

  9. 【转】ubuntu 双机热备

    1.关于软件安装 sudo apt-get install libssl-dev sudo apt-get install openssl sudo apt-get install libpopt-d ...

  10. Java Core - 创建对象的两种方式

    一.通过new关键字创建对象 Hello hello = null;  //  声明一个引用 hello = new Hello();  //  创建对象 以上两行代码相当于 Hello hello ...