指针是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的值就会发生改变。

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

最新文章

  1. bzoj4199:NOI2015D2T2品酒大会(SAM版)
  2. spring mvc中使用freemark的一点心得
  3. java Servlet+mysql 调用带有输入参数和返回值的存储过程(原创)
  4. ThinkPHP的增、删、改、查
  5. 【BZOJ】1862: [Zjoi2006]GameZ游戏排名系统 &amp; 1056: [HAOI2008]排名系统(treap+非常小心)
  6. HDU 5597 GTW likes function 打表
  7. Repeater控件中的LinkButton(转)
  8. 直接在存储过程里面写sql语句的话 ,会返回操作的结果
  9. 运用预加载提升H5移动页面的用户体验
  10. web client
  11. 贪心 CF 332 C 好题 赞
  12. Chapter2:Discrete-Time Signal Processing and Short-Time Fourier Analysis
  13. NIO FileChannel
  14. 使用Jenkins自动部署博客
  15. HTML5进阶(三)HBuilder实现软件自动升级(优化篇)
  16. H5 video播放视频遇到的问题
  17. (python)数据结构---集合
  18. NOsql总结
  19. ltp makefile 解析
  20. Maven 加载ojdbc14.jar报错,解决方法

热门文章

  1. python笔记14
  2. Linux下清空文件的3种方法
  3. 关于热部署Devtools出现同一个类型进行类型转换失败的问题
  4. Android学习笔记17:单项选择RadioButton和多项选择CheckBox的使用
  5. Fiddler抓包(基本使用方法、web+app端抓包、篡改数据、模拟低速)
  6. JAVA--文件内容属性替换
  7. redis集群命令及常规操作
  8. uniGUI之新窗口uniForm(19)
  9. 怎么样运行jar
  10. 《编写高质量iOS与OS X代码的52个有效方法》书籍目录