指针是C的精华,不会指针就等于没学C。但指针又是C里最难理解的部分,所以特意写下这篇博客整理思路。

一、指针类型的声明

  C的数据类型由整型、浮点型、字符型、布尔型、指针这几部分构成。前四种类型比较好理解,整型就存放整数,浮点就存放小数……

那么C语言的最大优势——指针它是存放什么的呢。指针难理解的第一个地方是没有自己的名称,例如整型就是 int 变量名,字符型就是char 变量名 ……

那么指针呢?

  理论上,按照C语言的变量声明格式,指针变量定义就是pointertype pointername;但事实上指针的标志是 pointertype* pointername。pointertype 可以是任意一种数据类型,pointername 为指针变量的名称(可随意定义,最好有意义,别随意定义A,B,C,D,E啥的),而最不起眼的 则是区分变量与指针变量的最重要的一部分。

  举几个例子

int* n;            //指向整形变量的指针n;
int *n; //意义同上,C语言允许这两种声明 double* n //指向双浮点型的变量的指针n; char* n //指向字符型变量的指针n; //诸如此类,flaot, long, short……不一一列举,自行类比推导。

二、指针的应用

  刚刚说完了指针的声明,那么新问题产生了,指针变量有什么用呢?在理解指针变量之前我们需要进一步了解一个C语言变量所固有的特性。那么一个C语言的变量一定会具有什么呢? 根据C语言声明变量方式 数据类型 变量名,可知,一个变量肯定会有的属性有 数据类型、变量名称。但仅此而已吗?变量存在的最大意义时存储。那么存储在什么地方呢?地址。计算机内存中的各个存储单元都是有序的,按字节编码。详细的自行百度。由地址的定义可知,只要存贮就需要地址。所以变量还有一个固定的属性地址,在一程序执行的过程中一旦开辟后,没有手动释放或者到达生命周期,地址就不会改变,类似于加了const限定符的变量。

  说了这么多,与指针有什么关系呢?指针是一种用来存储地址值的特殊变量,int型指针用来存储int型变量地址。那么新的问题就出现了,指针变量拿到地址后能能做什么呢?目前我接触到最多的在子函数中使用改变其他函数中变量的值,举个最简单的例子Swap函数

include <stdio.h>

void Swap1(int a, int b);                       //无指针的交换函数
void Swap2(int *a, int *b); //应用指针的交换函数 int main()
{
int a = , b = ;
Swap1(a, b);
printf("Swap1:\na = %d\nb = %d\n", a, b); //不会发生变化
Swap2(&a, &b);
printf("Swap2:\na = %d\nb = %d\n", a, b); //a和b发生了交换
} void Swap1(int a, int b)              
{
int temp = a;
a = b;
b = temp;
} void Swap2(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

  在C语言中Swap1被称为传值调用, Swap2被称为传地址调用,它们最大的区别在于,Swap1仅仅是复制了 a,b 的值,无论 a,b 在函数中如何变化都是独立的,不会与函数外部的 a,b发生冲突

而Swap2不同,它新建了两个指针变量,指向了函数外a,b的地址,一旦对指针a,b上的值进行操作,函数外的变量a,b的值就会发生改变。

  目前个人感觉指针最大作用是查找地址,然后对地址上的值进行改变,实现传递地址调用,便于程序员在函数外修改变量值。

C语言整理复习——指针的更多相关文章

  1. ndk学习之C语言基础复习----指针、函数、预处理器

    指针: 指针乃C.C++的灵魂之所在,所以有必要好好的复习复习.什么是指针?一句话来概括:“指针是一个变量,它的值是一个地址.”,其中指针变量的声明有如下三种形式: 其中第一种是被推荐的写法. 其中还 ...

  2. C语言知识点复习梳理

    C语言知识点复习梳理 C语言的知识点讲完了,接下来就是做一下整理与总结,然后就会进入其他知识的学习. 本文目录如下: 基础知识. 顺序程序设计. 数据类型. 标准输入输出. 进制转换. 选择结构. 循 ...

  3. C语言之漫谈指针(下)

    C语言之漫谈指针(下) 在上节我们讲到了一些关于指针的基础知识: 详见:C语言之漫谈指针(上) 本节大纲: 零.小tips 一.字符指针 二.指针数组与数组指针 三.数组传参与指针传参 四.函数指针及 ...

  4. C语言基础复习总结

    C语言基础复习总结 大一学的C++,不过后来一直没用,大多还给老师了,最近看传智李明杰老师的ios课程的C语言入门部分,用了一周,每晚上看大概两小时左右,效果真是顶一学期的课,也许是因为有开发经验吧, ...

  5. Swift3.0语言教程使用指针创建和初始化字符串

    Swift3.0语言教程使用指针创建和初始化字符串 Swift3.0语言教程使用指针创建和初始化字符串苹果的Swift团队花了不少功夫来支持C的一些基础特性.C语言中为我们提供了指针,Swift也不例 ...

  6. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  7. 【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化

    C 语言中的指针和内存泄漏 http://www.ibm.com/developerworks/cn/aix/library/au-toughgame/ 本文讨论了几种在使用动态内存分配时可以避免的陷 ...

  8. GO语言中的指针

    http://www.tizgrape.com/?p=100 Go语言中的指针语法和C++一脉相承,都是用*作为符号,虽然语法上接近,但是实际差异不小. Go使用var定义变量: var v6 *in ...

  9. 由链表初始化看C语言的二级指针

    先来看C语言创建链表.插入节点和遍历链表的一段代码: #include <stdio.h> #include <stdlib.h> typedef int ElemType; ...

随机推荐

  1. 浅谈Java三大特性之继承

    前言 简单用伪代码去介绍一些 父类与子类的构造函数问题 others 前言 类的继承性是面向对象语言的基本特性,多态性前提是继承性.Java 支持继承性和多态性.——Java从小白到大牛 继承:三大特 ...

  2. jmeter download historyList

    https://archive.apache.org/dist/jmeter/binaries/ 反馈,问题和评论应发送到Apache JMeter Users 邮件列表. 有关更多信息, 请访问Ap ...

  3. CPU的态

    CPU是OS最基本的硬件. cpu的态(mode): 1.mode展示CPU的工作状态 2.mode用来给对资源和指令权限的描述 分类: 1.kernel mode(核态): 权限最高 OS内核/管理 ...

  4. GCC 升级

    1.下载源码 wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz 2.下载依赖包编译安装 GCC 需要依赖 mpc,mpfr,gmp包. ...

  5. 【协作式原创】查漏补缺之乐观锁与悲观锁TODO

    面试官:你了解乐观锁和悲观锁吗? 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题. 悲观锁的实现方式是加锁,加锁既可以是对代码块加锁(如Java的synchronized关键字),也可以是 ...

  6. idna与utf-8编码漏洞

    来自Black hat 2019 原理什么是IDN?国际化域名(Internationalized Domain Name,IDN)又名特殊字符域名,是指部分或完全使用特殊文字或字母组成的互联网域名, ...

  7. VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.

    方案一: sudo vim /etc/sysctl.conf 增加下面内容(环境变量) fs.inotify.max_user_watches = 1638400 fs.inotify.max_use ...

  8. DAC

    DAC的功能:可以输出电压(无触发,设置DAC转换值,DAC使能更新寄存器和启动转换)或者波形(连续转换,用DMA发送数据,定时器触发).首先有个正弦波波形的数组,内存到DAC的DMA通道不断的将正弦 ...

  9. 列表推导式、生成器表达式以及zip()max()max()/min()sum()sort()map()filter()的用法

    列表推导式: 基本格式: variable = [out_exp_res for out_exp in input_list if out_exp == 2] #out_exp_res: 列表生成元素 ...

  10. 把链接生成二维码 二维码中间带有logo

    在工程中引入三个文件jquery.qrcode.js.qrcode.js.utf.js.其中utf.js文件是防止链接中的参数出现中文乱码现象 jquery.qrcode.js文件 function ...