指针简介
变量的地址的概念
内存是以字节为单位进行编址的,内存中的每个字节都对应一个地址,通过地址才能找到每个字节。
变量对应内存中的一段存储空间,该段存储空间占用一定的字节数,用这段存储空间的第一个字节的地址表示变量的地址。
指针的概念
指针是一个变量,与普通变量不同的是,普通变量中存储的是数据,指针变量中存储的是另一个变量的地址。这样我们就可以通过指针间接的对普通变量进行操作。
指针的特点
指针是一个变量,可以在程序执行过程中改变它的值,即可以改变指针的指向。可以在某时刻指向变量x,也可以在另一时刻指向变量y
指针可存放 C 语言中的任何基本数据类型、数组和其他所有高级数据结构的地址
若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址
应为指针指定一个地址后,才能在语句中使用指针
声明变量并初始化指针
与指针相关的运算符图解:
简介运算符
注意*预算符
int *p = 0xcc是对p本身值的初始化,就是p指向了位于0xcc地址的变量,这里的*代表声明一个指针变量,他是属于声明的一部分
而int *p,a;p = &a;*p=0xcc;注意补上了p指向a的代码
这里的*是一个操作符,*p代表了p所指变量,上面的情况就理解为a = 0xcc;
指针得点:
指针变量的命名规则和其他变量的命名规则一样
指针不能与现有变量同名
指针可存放 C 语言中的任何基本数据类型、数组和其他所有高级数据结构的地址
若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址
应为指针指定一个地址后,才能在语句中使用指针
指针是一个变量,可以在程序执行过程中改变它的值,即可以改变指针的指向。可以在某时刻指向变量x,也可以在另一时刻指向变量y
指针预算符
实质:指针中存储的地址的运算。
类型:
指针赋值运算:赋地址运算。
指针加减运算:
指针++或- -
指针加减一个整数
指针比较运算:两个指针比较运算。
使用递增/递减运算符(++ 和 --)将指针递增或递减
将指针加上或者减去某个整数值
(以n*sizeof(T)为单位进行移动)
注意:只有当指针指向一串连续的存储单元时,指针的移动才有意义。才可以将一个指针变量与一个整数n做加减运算。
指向数组的指针:
一个数组存储在一块连续内存单元中;数组名就是这块连续内存单元的首地址;
第 (i + 1) 个数组元素的地址可表示为 &data[i] 或 (data+i)
可以通过以下方式为指向数组的指针赋值:
int a[10];
pa=&a[0]; // 或者 pa=a;
一个指针变量可以指向一个数组元素
int *ptr,data[10];
ptr=data+3;//或者ptr=&data[3]
指针与数组
数组与地址
数组名代表数组(元素)的首地址,即第一个元素的地址。
对数组的首地址加上偏移量x就可以得到其它元素的地址。
数组元素的访问
下标法: 用 a[i] 的形式存取数组元素。
地址法: 用 *(a+i)的形式存取数组元素。
指针法:用指针变量p指向数组的首地址,然后通过移动指针存取数组元素。
如 p=a, *(p+i) = 1。
注意:
1.数组名是一个常量,不允许重新赋值。
2.指针变量是一个变量,可以重新赋值。
3.p+i和a+i均表示数组元素a[i]的地址,均指向a[i]
4.*(p+i)和*(a+i)均表示p+i和a+i所指对象的内容a[i]。
5.*p++:等价于*(p++)。其作用:先得到*p,再使p=p+1。
6.(*p)++:表示将p所指向的变量(元素)的值加1。即等价于 a[i]++ 。
7.指向数组元素的指针也可以表示成数组的形式,即允许指针变量带下标,如*(p+i)可以表示成p[i]。
总结:
指针是一个变量,它存储另一个对象的内存地址
指针的声明由基本类型、星号 (*) 和变量名组成
为指针赋值,赋值运算符右侧必须是一个地址。如果是普通变量需要在前面加一个取地址运算符 &;如果是另一个指针变量或者是一个数组,不需要加 &运算符
运算符 * 用于返回指针指向的内存地址中存储的值