C语言指针
写在前面的话
最近想用几篇文档把C语言的大概表述一下,也算是自己温习一遍了。
俗话说得好,只要把指针的理解清楚了,那C语言也就算是知晓大概了。这篇博文就只介绍指针
首先看下指针的简介
- 究竟什么是指针呢?一般来讲,指针是一个其数值为地址的变量(或者一般地说是一个数据对象),这句话可能理解起来有点抽象,下面举个实例来讲解下。
- 首先介绍下与指针相关的运算符
- 地址运算符:&
- 后面跟一个变量名时,&给出该变量的地址
- &num 表示变量num的地址
- 间接运算符:*
- 当后跟一个指针名或地址时,*给出储存在被指向地址中的数值
- num = 22;
- ptr = &num //指向num的指针
- val = *ptr //将ptr指向的值赋给val
- 地址运算符:&
- 指针声明
- int *ptr; //ptr是指向一个整数变量的指针
- char *pt; //pt是指向一个字符型变量的指针
- 建议把后面的解释多读几遍
- 类型标识符表明了被指向变量的类型,二星号(*)表示该变量为一指针。
- 声明int * ptr;的意思是pi是一个指针(它的值是地址,是一个常量),而*ptr是int类型的(该地址储存的变量是int类型的)
讲到这里可能有些人理解的还不是清楚,指针代表着地址,那地址究竟又是什么呢?
- 解释下地址的概念
- 在现在通常来说,访问地址的最小单位是字节 Byte,也就是8Bit
- 玩过单片机的同学都会知道,CPU有的是16位,32位等,也代表CPU的地址总线有几根
- 地址总线16根,每一根状态是0或1,那么一共就有2^16不同选择,同理32位
- 那么在内存中地址和储存的变量是什么样子的呢
- 首先要知道不同的数据类型所占的内存大小
- 地址总线16根,每一根状态是0或1,那么一共就有2^16不同选择,同理32位
- 我们再用一个图表示指针、地址、变量的关系
- 我们已经了解了指针的含义已经与地址、变量之间的关系,那么指针有什么用处呢,俗话说指针是C语言的灵魂,下面通过一个指针简单的例子来说明下
- 使用指针在函数见通信
#include<stdio.h>
/*-----------------------------------------------------------------------------------*/
void interchange(char *a_,char *b_)
{
char temp = 0;
temp = *b_;
*b_=*a_;
*a_=temp;
}
void main()
{
char a=5,b=10;
printf("Original value %d %d\n",a,b);
interchange(&a,&b);
printf("After interchange %d %d\n",a,b);
/*
Original value 5 10
After interchange 10 5
*/
}
- main函数定义的两个变量被interchange函数改变了,并且在这个例子中,我们并没有使用全局变量。只是将main函数内声明的两个变量的地址当做参数传给了interchange函数
- 一个函数可以更改另一个函数中的数值,而不通过全局变量仅仅靠指针就能做到,其实靠的就是改变指针指向的地址中的值,有点拗口,interchange函数直接操作的对象不是变量,而是指针