大家在C语言学习中,一定听到过“指针”这个词。下面就来聊聊“指针”
一.指针
1.概念:在生活中,我们将门牌号叫做地址;计算机中,我们把内存单元的编号也称为地址,在C语言中,地址有一个新的名字叫做指针。通过内存单元的编号,CPU可以找到一个内存空间;在C语言中,我们可以通过指针找到指针所指的对象。
2.指针变量和地址:我们平常说的指针,通常是指针变量,而指针变量就是用来存放内存变量的地址。
(1).取地址操作符(&):通过取地址操作符,我们可以获得一个变量的地址。
通过上段代码可以将a的地址打印出来,"%p"就是专门用来打印地址的。
(2).解引用操作符(*):通过指针找到一个变量的地址所指的对象
pa是存放a的地址,*pa则是通过pa找到a的地址所指的对象——10,把100赋值给*pa,打印出来100,我们能够知道*pa等价于a。
(3).指针变量的大小:
在32位平台下,地址是32个比特位,指针变量大小是4个字节。
在64位平台下,地址是64个比特位,指针变量大小是8个字节。
指针变量大小与内存无关,在相同平台下,大小都相同。
(4).指针变量类型:指针的类型决定了对指针解引用的时候有多大的权限(一次可以操作几个字节)。
char*pa:字符指针,解引用只能访问1个字节
int*pa:整型指针,解引用只能访问4个字节
short*pa:短整型指针,解引用只能访问2个字节
double*pa:双精度浮点型指针,解引用只能访问8个字节
二.指针运算
1.指针+-整数:
由此可知,指针类型决定+-整数时跳过几个字节,int*pa类型跳过4个字节2,char*pa跳过1个字节
2.指针-指针(地址-地址):前提条件是两个指针指向同一空间
由此可知,指针-指针的绝对值是指针和指针之间元素的个数。
3.指针的关系运算:地址大小的比较。
三.void*指针——无具体类型指针
一般使用在函数参数部分,用来接收不同类型数据的地址,实现泛型编程效果,使得一个函数来处理多个类型的数据。
四.野指针:指针指向的位置是不可知的
1.成因:(1).指针未初始化
(2).指针越界访问
(3).指针指向的空间释放
int* test()
{
int a=10;
return &a;
}
int main()
{
int* pa = test();
*pa=10;
return 0;
}
变量a的地址只在函数test内有效,当把a的地址传给指针pa时,因为出了test函数,变量a的空间释放,pa成为野指针。
四.传值调用和传址调用
1.传值调用
这段代码是用传值调用实现两个数相加
这段代码无法实现用传值调用来实现两个数的交换
2.传址调用
我们能够利用传址调用来实现两个数的交换