第8章 善于利用指针
什么是指针?
指针的概念
内存区的每一个字节有一个编号,这就是地址
由于通过地址能够找到所需的变量单元,地址指向该变量单元。
地址形象化的的称为指针
指针就是指向内存单元的变量,它指向内存单元的地址,通过指针可以访问到内存单元中的数据。
所以我们可以理解为:内存单元的编号=地址=指针
指针是一种数据类型,用来存储变量的地址。
指针的作用
指针的作用主要有以下几点:
访问内存中的数据:指针可以直接访问内存单元中的数据,因此可以提高程序的运行效率。
传递参数:指针可以作为函数的参数,用来传递数组、字符串、结构体等地址。
在程序中一般通过变量名来访问变量,但是指针可以直接访问内存单元中的数据,因此可以提高程序的运行效率。
void _swap(int a, int b)
{
int temp=a;
a=b;
b=temp;
}
int main(void)
{
int a=5,b=10;
_swap(a,b);
printf("a=%d b=%d",a,b);
return 0;
}
在这一段代码运行下来发现,输出的结果a还是等于5,b还是等于10,他们的值并没有交换.
原因是:在函数_swap中,a和b的值被临时保存到temp中,然后a的值被b的值覆盖,b的值被temp的值覆盖,但是main函数中的a,b并没有发生变化。
为了解决这个问题,我们需要用到指针,通过指针来访问内存单元中的数据,而不是通过变量名来访问。
|
指针变量
指针变量是一种变量,用来存储指针的地址。
指针变量可以用来指向其他变量,也可以用来指向数组、字符串、结构体等。
指针的定义:
int *p; // 定义一个整型指针变量p |
指针的初始化:
int a = 10; |
指针的运算:
int a = 10; |
指针的赋值:
int a = 10; |
指针的运算
指针的运算可以用来访问数组元素、字符串元素、结构体成员等。
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
指针的赋值可以用来修改变量的值、数组元素的值、字符串元素的值、结构体成员的值等。
int a = 10; |
指针的比较可以用来判断两个指针是否指向同一个地址。
int a = 10; |
指针的类型转换可以用来将指针转换为其他类型的指针。
int a = 10; |
指针的数组可以用来访问数组元素。
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
P223: 例8.2-输入a和b两个整数,按先大后小的顺序输出a和b
。
P226: 例8.4-对输入的两个整数按大小顺序输出
。
在引用数组元素是指针的运算:
指针已指向一个数组元素是,可以对指针进行以下运算:
加一个整数(用 +或 +=),如 p+1;
减一个整数(用 -或 -=),如 p-1;
自加运算,如 p++ 和 ++p;
自减运算,如 p-- 和 --p。
两个指针相减,如p1-p2(只有当
p1和
p2指向同一个数组元素时才有意义)。
分别说明如下
:
- 如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素,p-1指向同一个数组中的前一个元素。例如:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
2.如果p的初值为&a[0] ,则p+i 和 a+i就是数组元素a[i]的地址,或者说,它们指向a数组序号为i的元素。例如:
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; |
- 如果指针变量p1和p2指向同一个数组元素,则p1-p2表示两个指针之间的距离,即p1指向的元素距离p2指向的元素有多少个元素。
*(p+i)
:表示指针p
指向的地址加上i
个元素的地址,即*(p+i)
表示*(p+0)
、*(p+1)
、*(p+2)
…。*(p-i)
:表示指针p
指向的地址减去i
个元素的地址,即*(p-i)
表示*(p-10)
、*(p-9)
、*(p-8)
…。*(p+i)
和*(p-i)
都可以用来访问数组元素。