前言
在C语言的学习过程中,可能大多数人在指针这里会感觉到指针好难呀,当然,我也不例外。本人新手小白一枚,下面是我在学习C语言中对指针的一些看法和理解,仅供参考
一、指针是什么?
我们都知道,在计算机内部存储器,也就是内存中,储存单元是字节。每一个字节都有特定的编号,而这个字节编号我们称为地址。简单的说,指针就是存放地址单元的变量,可以理解为指针就是个地址变量。就像我们要找一个朋友,我们得知道他家的地址,在哪个楼哪个房间号,我们才能找到他。这就类似于我们要找到计算机字节所存的数据时,就需要用到指针去指向这个地址,我们才能找到。
注意:在计算机的存储中,虽然最小的储存单位是位(一个字节有八位)。但指针能访问到的地址单元编号是字节的编号
二、指针变量的定义和赋值
1.指针变量的定义
指针变量和我们学过的其他变量一样,在使用前都要先定义。
比如:
1.定义整型变量a,就是,数据类型+变量 int a
那么整型指针变量a怎么去定义呢?那就是,数据类型+指针标识符(*)+变量 int *a
当然数据类型我们还知道float,char等。所以有float *a , char a
注意:
1.变量名是指针标识符后面的a,只有a,而不是 * a
2. * 号有两个作用:①当指针标识符用,代表的是定义的变量是指针类型的。②取值,取地址中存放的东西(存放的东西可以是数值,也可以数组,也可以是地址(指针))
2.指针变量的赋值
我们都知道在C语言中,整型变量的赋值是先定义变量,再进行赋值。如:
int a;
a = 10;
那么指针变量的赋值也是这样的,不过定义的指针变量最好先初始化,指向零号地址NULL,避免野指针的出现(野指针就是定义的指针变量,指向的地址为随机的)。定义整型指针(pointer)变量:
int a = 10;
int *p = NULL; //意思是,定义了一个整型指针变量p, p指向了零号地址
p = &a ; //意思是,p的指向发生了改变,p指向了a的地址
*p = a ; //意思是,p取了地址a里面的东西,我们在上面定义了a,把 10 赋给了a,那么就代表了p取了里面的10,也就是说 *p = 10。
因此,我们可以通过改变指针p的指向和 *p的值去操作指针。从上面的式子 p =&a和 * p = a 我们可以知道 * 号和&是一对互逆运算。就是等号左边出现一个 * 号,我们就可以把等号右边的 & 和它一起消去。
当然,我们知道了p要指向a的地址,也可以用以下来赋值:
int a = 10 ;
int * p = &a ;
#include <stdio.h>
int main(void)
{
int a = 10;
int *p = &a;
printf("%d\n",*p);
printf("a的地址为%p",&a);
printf("p的地址为%p",p); //注意,这里的p指向了地址a,p = &a,
//p本身就是一个地址了,所以不用&符
return 0;
}
运行结果为:
可以看到 a 的地址和 p 的地址一样,这就是指针p指向了地址 a
注意:
定义一个指针,它的数据类型是int * 型,那么它指向变量的数据类型必须是int型;数据类型是char * 型,那么它指向变量的数据类型必须为char型。
三、const修饰指针
const的意思是只读(不能改变的意思)
①int * const p :const修饰的是p ,意思是p的指向不能发生改变,那我们要想操作,可以从 * p 下手,可以去改变 * p的值,去改变p的指向。
②int const * p: const 修饰的是 * p意思是 * p不能被改变,我们可以操作p的指向,改变*p的取值。
四、指针的数据类型和指向类型
无论是int * 型还是char * 型,float * 型…等的指针,其数据类型在32位操作系统中,占4个字节,在64位的操作系统中,占8个字节
①整型指针
int a = 10;
int * p = &a ;
指针的数据类型为:int *
指向类型为:int
②数组型指针(一维数组)
char arr[20] = { “hello”} ;
char (*)p [20]= & arr ;
指针的数据类型为: char * [20]
指针指向的数据类型为: char [20] 指针指向的类型为一维数组的数据类型。
注意:弄懂指针的数据类型和指向类型,对我们以后学数组指针有很大的帮助。指向类型比数据类型少个 * 号